我正在实现通用散列并使用以下通用散列函数:
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 。
答案 0 :(得分:17)
在 C ++ 11 中,您可以使用random header和std::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个随机位,它可能不会。