javascript - 生成正态分布的随机值时,定义范围的最有效方法是什么?

标签 javascript math random gaussian normal-distribution

仅供引用:随机 == 伪随机

一个。生成均匀随机数时,我可以指定一个范围,即:

(Math.random()-Math.random())*10+5
//generates numbers between -5 and 15

B.生成一组具有高斯式正态随机性版本的随机值:

//pass in the mean and standard deviation
function randomNorm(mean, stdev) {
  return Math.round((Math.random()*2-1)+(Math.random()*2-1)+(Math.random()*2-1))*stdev+mean);
}

//using the following values:
{
  mean:400, 
  standard_deviation:1
  //results in a range of 397-403, or +-range of 3
},
{
  mean:400, 
  standard_deviation:10
  //results in a range of 372-429, or +-range of 30
},
{
  mean:400, 
  standard_deviation:25
  //results in a range of 326-471, or +-range of 75
}

每个都给我一个大约 standard_deviation*(+-3) 的范围(假设我让程序运行的时间更长)。

C.我可以按如下方式计算这个范围:

  1. 假设我想要一个 300-500 的范围,那么 var total_range = 200;
  2. 我的平均值是 400,我的 +-range 是 total_range/2 (var r = 100)
  3. 因此 standard_deviation 将是 r/3 或在本例中为 33.333。

这似乎可行,但我不知道我在用数学做什么,所以我觉得自己像个白痴,这个解决方案感觉很笨拙而且不完全准确。

我的问题: 有什么我正在跳舞的公式可以帮助我吗?我的要求如下:

  1. 必须能够准确定义数字范围。
  2. 必须尽可能高效地使用 JavaScript 完成。

我想也许我很接近,但还不完全。

最佳答案

将两个随机数相减不会得到正态分布,它会得到在零的两边线性下降的数字。请参阅此 fiddle 中的红色图表:

http://jsfiddle.net/Guffa/tvt5K/

要获得良好的正态分布近似值,请将六个随机数相加。请参阅 fiddle 中的绿色图表。

因此,要获得正态分布的随机数,请使用:

((Math.random() + Math.random() + Math.random() + Math.random() + Math.random() + Math.random()) - 3) / 3

此方法基于中心极限定理,此处概述为第二种方法:http://en.wikipedia.org/wiki/Normal_distribution#Generating_values_from_normal_distribution

关于javascript - 生成正态分布的随机值时,定义范围的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20160827/

相关文章:

Javascript 对象原型(prototype)引用

javascript - 在 JavaScript 中给出特殊结果的比较运算符

math - 一种简单的多边形相交算法

java - 随机数发生器

shell - 从文件中读取随机行的简单方法是什么?

javascript - 我如何调整大小,然后使用 react-redux 渲染到 Canvas

javascript - react native : How to export a method with a return value?

c# - Circle - Line Intersection 不能正常工作?

java - tan 45 给我 0.9999

javascript - 使用事件监听器(Javascript、jQuery)将 BG 颜色更改为随机颜色?