我无法理解这一点,这更随机?
rand()
Run Code Online (Sandbox Code Playgroud)
要么
rand() * rand()
Run Code Online (Sandbox Code Playgroud)
我发现它是一个真正的脑筋急转弯,你能帮助我吗?
编辑:
直观地,我知道数学答案将是它们同样随机,但我不禁想到,如果你将两者相乘的话"运行随机数算法"两次,你会创造一些比随机更随机的东西它一次.
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函数的结果没有更大的变化.谢谢!
当我在各种浏览器中运行一些单元测试时,我今天遇到了一个奇怪的"bug".我在今天之前已经多次在Firefox中运行测试,甚至IE,但显然还不是Chrome(v19-dev).当我在Chrome中运行它时,它始终无法通过一次测试,因为我计算的两个值不匹配.
当我真正挖掘正在发生的事情时,我意识到问题是我假设如果我填充一个具有100,000个Math.random()值的数组,它们都将是唯一的(不会有任何冲突).事实证明,在Chrome中并非如此.
在Chrome中,我始终获得至少两对与100,000匹配的值.Firefox和IE9从未发生过冲突.这是我写的一个jsfiddle,用于测试它Math.random()在数组中创建1M 条目:http://jsfiddle.net/pseudosavant/bcduj/
有谁知道这是为什么用于Chrome的伪随机数生成器Math.random是真的不在于随机的?看起来这可能会对任何曾经使用的客户端js加密例程产生影响Math.random.
自从我学习计算机科学以来,每当随机数字出现时,它总是Mersenne Twister.甚至从来没有一个问题,没有其他选择.只是,使用Mersenne Twister.
那么JavaScript的Math.random使用了什么?似乎它应该使用Mersenne Twister,因为它显然没有同行,但我找不到任何关于它是否有效的参考.
有没有人知道它依赖什么,和/或为什么它不是MT,如果是这样的话?