6 年来,我的网站上有一个随机数生成器页面。很长一段时间以来,它是 Google 上“随机数生成器”的第一个或第二个结果,并且已被用来决定讨论论坛和博客上的数十个甚至数百个竞赛和绘图(我知道,因为我在我的网络日志,通常去看看)。
今天,有人给我发了电子邮件,告诉我这可能不像我想象的那么随意。她尝试生成非常大的随机数(例如,介于 1 和 10000000000000000000 之间)并发现它们几乎总是相同的位数。确实,我将函数包装在一个循环中,这样我就可以生成数千个数字,果然,对于非常大的数字,变化只有大约 2 个数量级。
为什么?
这是循环版本,因此您可以自己尝试一下:
http://andrew.hedges.name/experiments/random/randomness.html
它包括从Mozilla 开发人员网络获取的直接实现和 1997 年我从不再存在的网页上刷下的一些代码(Paul Houle 的“Central Randomizer 1.3”)。查看源代码以了解每种方法的工作原理。
我在这里和其他地方都读过关于Mersenne Twister 的文章。我感兴趣的是为什么 JavaScript 的内置Math.random函数的结果不会有更大的变化。谢谢!