Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript有多随机';数学是随机的吗?_Javascript_Random - Fatal编程技术网

JavaScript有多随机';数学是随机的吗?

JavaScript有多随机';数学是随机的吗?,javascript,random,Javascript,Random,六年来,我的网站上有一个页面。很长一段时间以来,这是谷歌上“随机数生成器”的第一个或第二个结果,并被用来决定论坛和博客上的几十个(如果不是几百个)竞赛和绘画(我知道,因为我在我的网络日志中看到了推荐人,通常会去看看) 今天,有人给我发电子邮件告诉我,这可能不像我想象的那样随机。她尝试生成非常大的随机数(例如,1到100000000000000000之间),发现它们几乎总是相同的数字。事实上,我将函数包装在一个循环中,这样我就可以生成数千个数字,而且对于非常大的数字,变化只有大约2个数量级。 为什

六年来,我的网站上有一个页面。很长一段时间以来,这是谷歌上“随机数生成器”的第一个或第二个结果,并被用来决定论坛和博客上的几十个(如果不是几百个)竞赛和绘画(我知道,因为我在我的网络日志中看到了推荐人,通常会去看看)

今天,有人给我发电子邮件告诉我,这可能不像我想象的那样随机。她尝试生成非常大的随机数(例如,1到100000000000000000之间),发现它们几乎总是相同的数字。事实上,我将函数包装在一个循环中,这样我就可以生成数千个数字,而且对于非常大的数字,变化只有大约2个数量级。

为什么?

以下是循环版本,您可以自己尝试:

它包含了一个直接的实现,它来自于和1997年的一些代码,我删除了一个不再存在的网页(Paul Houle的“Central Randomizer 1.3”)。查看源代码以查看每个方法的工作方式


我已经阅读并了解了Mersenne Twister。我感兴趣的是为什么JavaScript内置的Math.random函数的结果不会有更大的变化。谢谢

在我看来完全是随机的! (提示:它取决于浏览器。)

就我个人而言,我认为我的实施会更好,尽管我是从谁那里偷来的,谁应该总是得到承认:

function random() {
  return 4; // Chosen by a fair dice throw. Guaranteed to be random.
}

你的结果实际上是意料之中的。如果随机数在1到10^n的范围内均匀分布,那么您会期望大约9/10的数字有n个数字,另外9/100的数字有n-1个数字。

如果您使用类似100000000000000000的数字,您将超出Javascript使用的数据类型的准确性。请注意,生成的所有数字都以“00”结尾。

给定的数字介于1和100之间

  • 9有1位数字(1-9)
  • 90有两个数字(10-99)
  • 1有3位数字(100)

给定的数字介于1和1000之间

  • 9有一个数字
  • 90有两个数字
  • 900有3个数字
  • 1有4个数字
等等


因此,如果你随机选择一些,那么绝大多数选择的数字都会有相同的位数,因为绝大多数可能的值都有相同的位数。

好吧,如果你生成的数字达到,比如说1e6,你将有希望得到概率大致相等的所有数字。这也意味着你只有十分之一的机会得到一个数字少一位数的数字。百分之一的几率会减少两位数,等等。我怀疑你在使用另一个RNG时会看到很大的不同,因为你在数字上的分布是一致的,而不是它们的对数。

有不同类型的随机性。给你一个统一的数字分布

如果你想要不同的数量级,我建议使用指数函数来创建所谓的:

此函数应提供与2位数和3位数大致相同的1位数


还有其他随机数分布,如(也称为高斯分布)。

以下文章解释了主要Web浏览器中的math.random()是如何(不)安全的: . 它并不比典型的Java或Windows内置PRNG函数强


另一方面,实现周期2^19937-1的SFMT需要为每个PRNG序列维护2496字节的内部状态。有些人可能会认为这是不可原谅的代价。

< P>我在J.P/P>上尝试了JS伪随机数生成器。 我的朋友说它很随意:
从1到N均匀分布的非随机数具有相同的性质。请注意(在某种意义上)这是一个精度问题。0-99上的均匀分布(作为整数)确实有90%的数字有两位数。0-999999上的均匀分布有905个数字,其中有五位数字


任何一组数字(在一些不太严格的条件下)都有一个密度。当有人想讨论“随机”数时,应该指定这些数的密度(如上所述)。一个共同的密度是均匀密度。还有其他的:指数密度、正态密度等。在提出随机数生成器之前,必须选择相关的密度。此外,来自一种密度的数字通常可以通过龋齿的方式很容易地转换为另一种密度。

不过,在这种情况下,这不是他的问题。@Johannes-这是他的问题之一:)IEE754的分布不均匀。也许你们可以以2的增量表示0到999,并且有足够的精度,所以若你们多次选择这个数字,你们会注意到在这个范围内的均匀分布。10%为两位数,90%为三位数。但是,当您开始达到非常高的数值时,增量将超过1。你可能只能从一万亿步到一万亿步一千步而不是一万亿步。虽然对于较小的数字/规模,这种影响可以忽略不计,甚至不存在。不过,缩放效果的影响要大得多。+1表示它依赖于浏览器,-1表示在不链接的情况下借用xkcd。需要与否,因为它是xkcd,所以它被赋予属性。:)OT:我感到惊讶和高兴的是,“XKCD”是本周一个大学挑战问题的答案:DBergi:直接链接还不够?我想他们的意思是这个笑话没有被正确引用(“random=4;”而不是“return 4;”)。数字数量的分布预计会出现偏差。然而,数字对数的分布应该是均匀的。你认为随机性意味着完美且均匀分布的想法很有趣。...@R.Pate-除非随机数再次均匀分布在长范围内,否则随机数生成没有多大用处@大卫是
function random_powerlaw(mini, maxi) {
    return Math.ceil(Math.exp(Math.random()*(Math.log(maxi)-Math.log(mini)))*mini)
}