如何在C++中生成非常大的随机数

问题描述:

我想用C++在0 - 2^64范围内生成非常大的随机数。我使用了rand()函数,但它不会生成很大的数字。任何人都可以帮忙吗?如何在C++中生成非常大的随机数

+0

做了一些你想让这个号码成为一个号码本身?或者只是像哈希这样的字符串?或者你更喜欢把一个很长的数字作为一个字符串? –

+0

你可能想参考:http://*.com/questions/8120062/generate-random-64-bit-integer – Bettorun

+2

“非常大”?一个简单的'std :: uint64_t'可以包含所有这些值。 –

用C++ 11,使用标准random library of c++11,可以做到这一点:

#include <iostream> 
#include <random> 

int main() 
{ 
    /* Seed */ 
    std::random_device rd; 

    /* Random number generator */ 
    std::default_random_engine generator(rd()); 

    /* Distribution on which to apply the generator */ 
    std::uniform_int_distribution<long long unsigned> distribution(0,0xFFFFFFFFFFFFFFFF); 

    for (int i = 0; i < 10; i++) { 
     std::cout << distribution(generator) << std::endl; 
    } 

    return 0; 
} 

Live Demo

+1

从来没有见过'API'这个词用于这个。 –

+0

@GillBates,编辑 – coyotte508

+0

该解决方案仅生成大量数据。如果我想在0 - 2^64范围内生成数字,该怎么办? –

如果您rand()功能只适用于范围[0, 2^15)给出的数字,那么您可以连接通过rand()返回范围[0, 2^64)获得数5个号码。

当然,还有其他可能的解决方案(可能会更好)。 C++库中的rand()函数通常是linear congruential generator。你可以简单地使用相同的数学原理实现你自己的发电机。

例如,下面的代码生成64位的随机数:

unsigned long long rand64() 
{ 
    static unsigned long long seed; 
    seed = seed * 6364136223846793005 + 1442695040888963407; 
    return seed; 
} 

参数63641362238467930051442695040888963407是那些使用高德纳。

该方法的优点和缺点在上面的wiki页面中讨论。如果不需要高质量的随机性,它可能是一个不错的选择。

+3

为什么异或实际上?为什么20位的分段?你会详细说明这些神奇的数字吗? –

+2

你能解释一下return语句的逻辑吗? –

+0

32768只有2^15,所以这些20的位移不会填满所有的位。 – interjay

如在范围[0, 2^64)均匀随机数为64只随机比特,可以只是使用std::mt19937_64直接返回值:

#include <random> 

int main() { 
    std::mt19937_64 gen (std::random_device{}()); 

    std::uint64_t randomNumber = gen(); 
} 

注意播种梅森倍捻机发动机一个32位的种子不是最优的,为了更好的方式,请看this

另请注意,最近通常不鼓励使用randHere是由Stephan T. Lavavej就该主题发表的演讲。

我也会考虑使用操作系统设施。所有现代系统都有加密模块,能够生成任意长度的非常好的随机字节数组。 Linux有getrandom()。 Windows有CryptGenRandom。 OpenBSD有arc4random。 iOS有SecRandomCopyBytes。等等

我写了生成随机19位数的函数它的运行方式与标准rand()函数完全相同。它从19位数字中提取每个数字并将它们存储在一个数组中,然后将它们放在一起以制作非常大的随机数。

unsigned long long Randomize() 
{ 
    unsigned long long randnumber = 0; 
    int digits[20]; 

    for (int i = 19; i >= 1; i--) 
    { 
     digits[i]=rand()%10: 
    } 
    for(int i=19; i>=1; i--) 
    { 
     unsigned long long power = pow(10, i-1); 

     if (power%2 != 0 && power != 1)  //eliminates "bug" (which comes from long long power is not a float)) 
      power++; 

     randnumber += power * digits[i]; 
    } 
return randnumber; 
} 

要使用此功能,你需要实现一些库

#include <stdlib.h> 
#include <time.h> 
#include <math.h> 

例如:

srand(time(NULL)); 
randomnumber = Randomize()%10000000+10000000; 
在这种情况下,随机数

是从千万到20000000