6年我有一个随机数发生器在我的网站页面。 很长一段时间,它是第一个或第二个结果对谷歌为“随机数发生器”,并已用于确定几十个,甚至几百个在论坛和博客(我知道,因为我看到的引荐竞赛和图纸的我网络日志通常去看看)。
今天,有人通过电子邮件我,告诉我它可能不是我想象的那么乱。 她试图产生非常大的随机数(和10000000000000000000例如,介于1),并发现它们几乎都是相同的位数。 事实上,我在一个循环包裹功能,所以我可以产生数以千计的数字果然,对于非常大的数字, 变化只有约2个数量级。
为什么?
这里是循环的版本,所以你可以尝试一下自己:
http://andrew.hedges.name/experiments/random/randomness.html
它包括取自一个简单的实现Mozilla开发者网络 ,并从1997年一些代码,我刷过的网页已不存在(保罗埒的“中央随机数发生器1.3”)。 查看源代码,看看每一种方法是如何工作的。
我读过这里和其他地方的约赛特旋转。 我很感兴趣的是,为什么就不会有从JavaScript的内置的Math.random函数的结果更大的变化。 谢谢!
鉴于1和100之间的数字。
- 9有1位(1-9)
- 90有2位(10-99)
- 1具有3位数字(100)
鉴于1和1000之间的数字。
- 9有1位
- 90有2个位数
- 900有3个数字
- 1具有4个位数
等等。
所以,如果你随意选择一些,那么绝大多数选择的号码将具有相同的位数,因为绝大多数可能的值具有相同的位数。
您的结果实际上是预期。 如果随机数均匀分布在范围为1〜10 ^ n,那么你所期望的对数的9/10有n个数字,并进一步百分之九有N-1个数字。
有不同类型的随机性。 的Math.random给你号的均匀分布。
如果你想不同量级,我会建议使用指数函数来创建什么叫做幂律分布 :
function random_powerlaw(mini, maxi) {
return Math.ceil(Math.exp(Math.random()*(Math.log(maxi)-Math.log(mini)))*mini)
}
这个功能应该给你大致相同数量的1位数为2位数的和为3位数字。
还有其他分布随机数,如正态分布 (也称为高斯分布)。
下面本文介绍的Math.random()在主流Web浏览器是如何(UN)的安全: “临时用户跟踪的主流浏览器和跨域信息泄露和攻击”,由在一片克莱恩(2008) 。 这并不比典型的Java或内置的PRNG功能的Windows更强。
在另一方面,在实施期间的SFMT 2 ^ 19937-1需要2496个字节保持每个PRNG序列内部状态。 有些人可能认为这是不可饶恕的成本。
看起来完全随机的给我! (提示:这是依赖于浏览器。)
就个人而言,我觉得我的执行效果会更好,但我从偷了它关闭XKCD ,谁应该始终进行确认:
function random() {
return 4; // Chosen by a fair dice throw. Guaranteed to be random.
}
如果你使用一些像10000000000000000000你超越JavaScript是使用数据类型的精度。 需要注意的是产生的所有的数字结束“00”。
好吧,如果你正在生成的数字了,比方说,1E6,你会希望得到所有的数字大约相等的概率。 这也意味着,你只有在获得一些与一个数字少十个机会一。 一百分之一分的机会让两位少,等我怀疑你会看到太大的区别使用其他RNG的时候,因为你必须在整个数字均匀分布,而不是他们对数。
从1均匀地分配到N个非随机数具有相同的属性。 需要注意的是(从某种意义上说)这是精度问题。 上0-99(作为整数)的均匀分布确实有90%的具有两个数字其数字。 在0-999999均匀分布具有五位数字的号码905。
任何一组数字的(有些不太严格的条件下)的密度。 当有人想讨论“随机”的数字,这些数字的密度应符合规定(如上所述)。常见的密度是均匀的密度。 还有其他的:指数密度,正常密度等,其中必须选择密度是提出一个随机数生成器之前有关。 另外,从一个密度来号码通常可以容易地转换到由龋装置的另一个密度。