C++ 如何生成64位随机数?

C++ 如何生成64位随机数?,c++,random,universal-hashing,C++,Random,Universal Hashing,我正在实现通用哈希并使用以下通用哈希函数: h(k)=((A*k)模块2^64)rsh 64-r 其中A是介于 2^61和2^62 < > C++中的 RAND()/Cux>函数具有返回类型整数,不能生成大数。那么我如何在这个范围内生成随机数呢?(数字应该是非常随机的,即每个数字被选择的概率应该相等) 注: long long int random=rand(); 由于rand返回的数字为int,因此不起作用。((long-long)rand()在C++11中,您可以使用和以及,这应该是您想要

我正在实现通用哈希并使用以下通用哈希函数:

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

其中A是介于

2^61和2^62

< > C++中的<代码> RAND()/Cux>函数具有返回类型整数,不能生成大数。那么我如何在这个范围内生成随机数呢?(数字应该是非常随机的,即每个数字被选择的概率应该相等)

注:

long long int random=rand();
由于
rand
返回的数字为int,因此不起作用。

((long-long)rand()在C++11中,您可以使用和以及,这应该是您想要的():

#包括
#包括
#包括
int main()
{
std::随机_装置rd;
std::mt19937_64 e2(rd());
标准:统一内部分布区(标准::llround(标准::pow(2,61)),标准::llround(标准::pow(2,62));

std::我看不懂。如果你手头有一个好的PRNG(而不是
std::rand()
),你可以从中生成N位并连接它们。或者一次生成M位并连接它们。因为如果它好,每个位都有相同的概率,因此连接它们是安全的。请注意,这实际上不会产生很好的结果。(因为std::rand很糟糕)+1注意:在crap-tastic MS VC++环境中,RAND_MAX是一个遗留的可怜的0x7FFF,这不会起作用。@Whoz:我所见过的每一个其他实现都与crap-tastic一样。
std::RAND
99.9%的时间是由某种描述的线性同余生成器驱动的——相比之下,它返回的范围是一个小问题@BillyONeal如果受到0x7FFF的限制,在这种情况下这是一个巨大的问题,因为生成的数字根本不在所需的范围内,更不用说在所述范围内均匀分布了(2^61..2^62)@BillyONeal噢,我从来没有声称这是唯一阻碍这个答案可行的因素。我会像沙菲克一样毫无疑问地实现这一点。我的观点是这取决于RAND_MAX的顶级范围,这并不总是人们认为的那样。但我当然也同意你的观点,即使顶级是0x7FFFFFFFF(因为它在大多数sane 32位
int
平台上,除了MS之外)这仍然存在您描述的LCG的一致性问题。
((long long)rand() << 32) | rand()
#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 ;
}