JavaScript Math.random 正态分布(高斯钟曲线)?

108

我想知道 JavaScript 函数 Math.random 是否使用正态分布而非均匀分布。

如果不是,我该如何获得使用正态分布的数字?在互联网上没有找到一个清晰的算法来生成随机正态分布的数字。

我想重建一台 Schmidt 机器(德国物理学家)。该机器会产生0或1的随机数,并且它们必须服从正态分布,以便我可以将它们作为高斯钟形曲线绘制出来。

例如,随机函数生成120个数(0或1),这些数值的平均值(均值)必须接近60。


1
不是答案(因为这不是你的问题:P),但这应该会有所帮助:http://www.meredithdodge.com/2012/05/30/a-great-little-javascript-function-for-generating-random-gaussiannormalbell-curve-numbers/ - Jongware
3
对 Math.random() 进行几次平均,即使只调用 3 次,也能得到类似正态分布的分布情况。请参见此处 https://jsbin.com/tetizotugu/1/edit?js,output,修改第一个参数即可。 - GameAlchemist
1
这是一个非常普遍的困惑,因为在人们理解正态曲线之前,统计学通常被教授为最重要的事情。如果您对每个样本取30次硬币的平均值(sum xs / length xs),那么这30个平均值将近似地服从于正态分布,并且随着您将30增加到更大的数字,它将收敛于以0.5为中心的完美正态曲线。随机本身是均匀整数分布(具有参数n、n + 1,通常为0、1),这就是在C++中使用的mersanne twister随机引擎mt19937中所知道的。 - Dmytro
2
这个问题本身就很有价值,因为它要求生成正态分布的随机数。关于 OP 的使用情况,他没有像 Dmirty 一样解释得很清楚。 - Andre Figueiredo
21个回答

-3
//This is what I use for a Normal-ish distribution random function.
function normal_random(){
  var pos = [ Math.random(), Math.random() ];
  while ( Math.sin( pos[0] * Math.PI ) > pos[1] ){
    pos = [ Math.random(), Math.random() ];
  }   
  return pos[0];
};

此函数返回介于0和1之间的值。通常返回接近0.5的值。


1
我绝不是数学天才,但我对你的算法实现([JSFiddle](http://jsfiddle.net/dje3z093/1/))的理解与你的恰好相反。0.5 最少被返回。为避免混淆,我认为你还应该明确说明这不是用于计算正态分布随机点的对数,而是用于计算圆周上的随机点的对数。 - Pascalculator
高斯分布以零为中心,且无上限。这是否与您的算法有任何相似之处? - Ricardo Magalhães Cruz
1
需要将符号从 > pos[1] 改为 < pos[1],否则看起来像一个碗。http://jsfiddle.net/p3y40gf3/17/ - Shimon Doodkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接