【发布时间】:2012-01-25 19:42:02
【问题描述】:
我试图在不使用 boost 的情况下在 C++ 中获得一个介于 0 和 1 之间的统一随机数。我不想依赖图书馆。
每当我开始我的程序时,我都会播种: srand(时间(NULL));
然后我打印 8 个随机数。我用空行分隔程序的不同运行:
Random number: 0.226063
Random number: 0.449186
Random number: 0.474514
Random number: 0.160779
Random number: 0.220868
Random number: 0.136685
Random number: 0.260120
Random number: 0.843334
Random number: 0.226181
Random number: 0.422253
Random number: 0.808594
Random number: 0.040531
Random number: 0.212377
Random number: 0.421073
Random number: 0.965790
Random number: 0.026305
Random number: 0.226306
Random number: 0.526858
Random number: 0.898279
Random number: 0.378934
Random number: 0.736653
Random number: 0.924420
Random number: 0.718503
Random number: 0.888140
Random number: 0.226463
Random number: 0.157614
Random number: 0.010386
Random number: 0.551936
Random number: 0.391998
Random number: 0.303603
Random number: 0.659396
Random number: 0.465434
为什么第一个数字每次都几乎完全相同?我不明白。我应该扔掉第一个数字还是什么?
示例代码:
#include <iostream>
int main() {
srand( time(NULL) );
printf("%f\n", (float)rand()/RAND_MAX);
printf("%f\n", (float)rand()/RAND_MAX);
printf("%f\n", (float)rand()/RAND_MAX);
printf("%f\n", (float)rand()/RAND_MAX);
printf("%f\n", (float)rand()/RAND_MAX);
printf("%f\n", (float)rand()/RAND_MAX);
printf("%f\n", (float)rand()/RAND_MAX);
printf("%f\n", (float)rand()/RAND_MAX);
}
【问题讨论】:
-
我应该扔掉第一个数字还是什么?显然是的。
-
您能否提供一个完整的代码清单,说明您是如何生成值的。
-
请记住,靠近的两个时间样本将具有相似的值。 RNG 在播种时会对种子进行卷积,但根据 RNG 算法,它可能无法在 2-3 个周期内实现完全随机性。最好丢弃一些数字(随机丢弃数是理想的)以创建最佳随机性。
-
如果您不信任 RNG,那么您没有理由不根据已发布的算法编写自己的 RNG。一些较旧的“标准”RNG 是出了名的差。
-
什么实现(编译器、运行时库、操作系统)?