兰德()真的那么糟糕吗?

use*_*679 10 c++ random c++11

通用随机数生成的启发,我决定执行自己的测试,看看rand()出了什么问题.使用这个程序:

srand(time(0));
for (int i = 0; i < 1000000; ++i)
{
    std::cout << rand() % 1000 << " ";
}
Run Code Online (Sandbox Code Playgroud)

我使用命令在Octave中加载它:

S = load("test.txt")
hist(S)
Run Code Online (Sandbox Code Playgroud)

得到了这个结果:

结果

对我来说,结果看起来非常均匀.我预计结果会更加偏斜.我的测试错了吗?

NPE*_*NPE 12

你问题中的测试并没有真正测试随机性.它所做的就是确保数字均匀分布.这是必要但不充分的条件:随机数发生器有许多其他方法可能不足.

例如,如果我给你的函数在循环中返回数字0,1,2,...,999,它也会通过你的测试.然而,任何合理的随机性定义显然都会失败.

要了解随机数生成器在实践中的测试方法,请查看

有关rand()具体的讨论,请查看rand()Considered Harmful.