仅供引用:随机 == 伪随机
一个。生成均匀随机数时,我可以指定一个范围,即:
(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.我可以按如下方式计算这个范围:
- 假设我想要一个 300-500 的范围,那么 var total_range = 200;
- 我的平均值是 400,我的 +-range 是 total_range/2 (var r = 100)
- 因此 standard_deviation 将是 r/3 或在本例中为 33.333。
这似乎可行,但我不知道我在用数学做什么,所以我觉得自己像个白痴,这个解决方案感觉很笨拙而且不完全准确。
我的问题: 有什么我正在跳舞的公式可以帮助我吗?我的要求如下:
- 必须能够准确定义数字范围。
- 必须尽可能高效地使用 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/