如何在C++中生成非常大的随机数
用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;
}
如果您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;
}
参数6364136223846793005
和1442695040888963407
是那些使用高德纳。
该方法的优点和缺点在上面的wiki页面中讨论。如果不需要高质量的随机性,它可能是一个不错的选择。
为什么异或实际上?为什么20位的分段?你会详细说明这些神奇的数字吗? –
你能解释一下return语句的逻辑吗? –
32768只有2^15,所以这些20的位移不会填满所有的位。 – interjay
我也会考虑使用操作系统设施。所有现代系统都有加密模块,能够生成任意长度的非常好的随机字节数组。 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
做了一些你想让这个号码成为一个号码本身?或者只是像哈希这样的字符串?或者你更喜欢把一个很长的数字作为一个字符串? –
你可能想参考:http://*.com/questions/8120062/generate-random-64-bit-integer – Bettorun
“非常大”?一个简单的'std :: uint64_t'可以包含所有这些值。 –