General purpose random number generation的启发,我决定执行自己的测试以查看rand()出了什么问题。使用此程序:

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

我使用以下命令将其加载到Octave中:
S = load("test.txt")
hist(S)

并得到以下结果:

对我来说,结果似乎很统一。我希望结果会更偏斜。我的考试做错了吗?

最佳答案

您问题中的测试并未真正测试随机性。它所做的只是确保数字均匀分布。这是一个必要条件,但不是充分条件:还有许多其他方式可能会使随机数生成器不足。

例如,如果我为您提供了一个循环返回数字0、1、2,...,999的函数,则该函数也将通过您的测试。然而,它显然将无法对随机性做出任何合理的定义。

要了解如何在实践中测试随机数生成器,请看一下

  • http://csrc.nist.gov/groups/ST/toolkit/rng/documents/nissc-paper.pdf
  • http://www.random.org/analysis/
  • http://www.random.org/analysis/Analysis2005.pdf

  • 有关rand()的专门讨论,请查看 rand() Considered Harmful

    10-07 14:47