在C / C ++中获取大的随机数

标准rand()函数给出的数字对我来说不够大:我需要unsigned long long 。 我们如何获得非常大的随机数? 我尝试修改一个简单的哈希函数,但它太大 ,运行时间太长,从不产生小于1e5的数字!!

这是一个便携式C99解决方案,它返回一个随机的64位数字:

 unsigned long long llrand() { unsigned long long r = 0; for (int i = 0; i < 5; ++i) { r = (r << 15) | (rand() & 0x7FFF); } return r & 0xFFFFFFFFFFFFFFFFULL; } 

说明: rand()返回0到RAND_MAX范围内的整数, RAND_MAX仅保证至少为32,767(15个随机位)。 long long保证有64位但可能更大。

您可以使用std::uniform_int_distribution轻松完成此操作。

简单的示例代码(取自此处 ,修改为使用unsigned long long ):

 #include  #include  int main() { std::random_device rd; std::mt19937 gen(rd()); std::uniform_int_distribution dis(lowerBorder, upperBorder); for (int n=0; n<10; ++n) std::cout << dis(gen) << ' '; std::cout << '\n'; } 

请注意,为了演示目的而在此处进行的mersenne twister播种并不完美,例如请参见此处 。

如果你只想从rand()返回的值生成无符号long long并且不关心结果的特性,请考虑以下函数,该函数必须是编译器版本和平台无关的(因为没有使用“幻数”):

 // this header has RAND_MAX value #include  // and this header has ULLONG_MAX #include  unsigned long long ullrand() // Produces pseudo-random numbers from 0 to ULLONG_MAX // by filling all bits of unsigned long long integer number // with bits of several "small" integer numbers generated by rand() { unsigned long long myrndnum = 0; // at the beginning just zero unsigned long long counter = ULLONG_MAX; // at the beginning we have all bits set as 1 // ... and while at least one bit is still set to 1 while(counter > 0) { myrndnum = (myrndnum * (RAND_MAX + 1)) + rand(); // fill some bits from rand() counter /= (RAND_MAX + 1); // decrease number of 1-bits in counter } // Return the result return myrndnum; } 

但是如果你想要一些具有某些预定特征的随机数序列,你应该查看一些特定的指南或数学书籍。 例如https://www.gnu.org/software/gsl/manual/html_node/Random-number-generator-algorithms.html

您没有要求特定的操作系统,这里的答案非常好,但在Linux上(也可能在其他操作系统上),您也可以从随机设备中读取。

例:

 #include  #include  #define RANDDEV "/dev/urandom" unsigned long long bigrand(void) { FILE *rdp; unsigned long long num; rdp = fopen(RANDDEV, "rb"); assert(rdp); assert(fread(&num, sizeof(num), 1, rdp) == 1); fclose(rdp); return num; } 

写在手机上,可能有bug。 :P

您还可以使用boost库(取自链接 ):

 #include  // std::time #include  #include  #include  #include  #include  int main() { long long my_min = 1; long long my_max = 1e5; boost::mt19937 generator(static_cast(std::time(0))); boost::variate_generator > die_gen(generator, boost::uniform_real<> (my_min, my_max)); boost::generator_iterator > > die(&die_gen); std::cout<<"Generated random numbers: \n"; for (int i=0; i <10 ; i++) { std::cout<< static_cast(*die++) << std::endl; } return 0; } 

试试这个:

 long N=1000000; long randNumber; for(long i=0;i