【发布时间】:2014-06-24 18:25:23
【问题描述】:
我的理解是,伪随机数生成器基本上只需要一些数字(种子),用一堆 XOR 和位移对其进行散列,然后吐出一个非常长的数字,从中可以检索余数得到你的“随机”号码。
现在,通常你会使用 time(NULL) 作为 C/C++ 中 rand() 的种子。但是,time(NULL) 仅每秒递增一次,而不是每毫秒递增一次。那么,如果种子仍然是相同的 time(NULL) 值,我如何在不到一秒的时间内循环 rand() 一千次,并且仍然得到不同的数字作为输出?
【问题讨论】:
-
在循环中调用
rand()之前调用srand(time(NULL));,您会看到输出一秒钟都不会改变。这就是为什么您通常应该只在程序开始时播种一次 RNG。此外,C++11 在<random>标头中添加了一堆更好的 RNG。如果你的编译器支持它们,你应该使用它们。 -
如果您对伪随机数生成器感兴趣,请查看 Donald Knuth 不朽的“计算机编程艺术”。该主题有广泛的报道。