10

ユニバーサル ハッシュを実装し、次のユニバーサル ハッシュ関数を使用しています。

h(k)=((A*k)mod 2^64) rsh 64-r

ここで、A は次の間の乱数です。

2^61 と 2^62。

C++rand()関数は戻り値の型が整数であり、その大きな数値を生成できません。では、この範囲で乱数を生成するにはどうすればよいですか? (数字は非常にランダムである必要があります。つまり、すべての数字が選択される確率が等しい必要があります)

ノート:

long long int random=rand();

によって返される数値randintであるため、機能しません。

4

2 に答える 2

21

C++11 ではランダム ヘッダーstd::uniform_int_distributionを std:: mersenne_twister_engineの64 ビット インスタンスと共に使用できます。

#include <iostream>
#include <random>
#include <cmath>

int main()
{
    std::random_device rd;

    std::mt19937_64 e2(rd());

    std::uniform_int_distribution<long long int> dist(std::llround(std::pow(2,61)), std::llround(std::pow(2,62)));

    std::cout << std::llround(std::pow(2,61)) << std::endl; 
    std::cout << std::llround(std::pow(2,62)) << std::endl; 

    for (int n = 0; n < 10; ++n) {
            std::cout << dist(e2)<< ", " ;
    }
    std::cout << std::endl ;
}

C++11がオプションでない場合、いくつかの 64 ビット Mersenne Twister 実装で使用できるソース コードがあるようです。

于 2014-01-13T16:29:42.233 に答える
7
((long long)rand() << 32) | rand()

編集: rand() が 32 個のランダム ビットを生成すると仮定していますが、生成されない可能性があります。

于 2014-01-13T16:18:02.910 に答える