如何生成64位随机数?

时间:2014-01-13 16:14:58

标签: c++ random universal-hashing

我正在实现通用散列并使用以下通用散列函数:

  

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

其中A是

之间的随机数
  

2 ^ 61和2 ^ 62。

C ++ 中的rand()函数返回类型为 integer ,并且无法生成那些大数字。那么如何在这个范围内生成随机数? (数字应该是非常随机的,即每个数字的选择概率应该相等)

注意:

long long int random=rand();

不起作用,因为rand返回的数字是 int

2 个答案:

答案 0 :(得分:17)

C ++ 11 中,您可以使用random headerstd::uniform_int_distribution以及64-bit instance of std::mersenne_twister_engine这可以做您想做的事情( {{ 3}} 的):

#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 不是一个选项,那么see it live似乎有可用的源代码。

答案 1 :(得分:7)

((long long)rand() << 32) | rand()

编辑:假设rand()产生32个随机位,它可能不会。