随机化正态分布数字的偏差(javascript)
Bias in randomizing normally distributed numbers (javascript)
我在生成正态分布随机数(mu=0 sigma=1)时遇到问题使用JavaScript .
我尝试了Box-Muller的方法和ziggurat,但生成的一系列数字的平均值为0.0015或-0.0018 -离零很远!!超过50万个随机生成的数字是个大问题。它应该接近于零,比如0.000000000001。
我不知道这是一个方法问题,还是JavaScript的内置Math.random()
生成不完全均匀分布的数字。
有没有人发现类似的问题?
这里可以找到ziggurat函数:
http://www.filosophy.org/post/35/normaldistributed_random_values_in_javascript_using_the_ziggurat_algorithm/下面是Box-Muller的代码:function rnd_bmt() {
var x = 0, y = 0, rds, c;
// Get two random numbers from -1 to 1.
// If the radius is zero or greater than 1, throw them out and pick two
// new ones. Rejection sampling throws away about 20% of the pairs.
do {
x = Math.random()*2-1;
y = Math.random()*2-1;
rds = x*x + y*y;
}
while (rds === 0 || rds > 1)
// This magic is the Box-Muller Transform
c = Math.sqrt(-2*Math.log(rds)/rds);
// It always creates a pair of numbers. I'll return them in an array.
// This function is quite efficient so don't be afraid to throw one away
// if you don't need both.
return [x*c, y*c];
}
如果生成n
独立正态随机变量,则平均值的标准差将为sigma / sqrt(n)
。
在你的例子中n = 500000
和sigma = 1
,所以平均值的标准误差大约是1 / 707 = 0.0014
。95%置信区间,给定0均值,大约是这个的两倍或(-0.0028, 0.0028)
。你们的抽样平均数正好在这个范围内。
您获得0.000000000001
(1e-12
)的期望不是基于数学的。为了达到这个精度范围,您需要生成大约10^24
个样本。以每秒10,000个样本的速度,这仍然需要3千万亿年的时间来完成……这就是为什么在可能的情况下最好避免模拟计算。
另一方面,你的算法似乎是正确实现的:)
相关文章:
- Javascript 正则表达式 : ^[^/s/]+[a-z]{1,}[0-9]*[-_]*[^/][
- JavaScript正则表达式文本与RegExp对象
- 将javascript正则化为vb
- 将po-box javascript正则表达式转换为c#regex
- 被javascript正则表达式分组卡住了
- 从字符串中提取年份的Javascript正则表达式
- 尝试使用Javascript正则表达式来获取“&"分隔文本,无论它是否's是最后一个值
- JavaScript正则表达式匹配量
- 在字符串列表中搜索任何出现的单词,如果单词的第一个字符匹配,则高亮匹配单词.Javascript正则表达式
- javascript正则表达式来识别所有特殊字符
- Javascript-正则表达式,用于在未转义字符上拆分字符串,例如|,但忽略|
- 查找所有注释的JavaScript正则表达式
- javascript正则表达式验证未按预期工作
- javascript正则表达式,用于匹配带数字和不带数字的字符串
- 将正态分布转换为线性分布
- 当生成正态分布的随机值时,定义范围的最有效方法是什么
- 绘制具有 JS 中平均值和标准偏差的正态分布曲线
- 绘制正态分布曲线,左下角区域在 javascript 中带有阴影
- 如何使用CSS和JavaScript绘制正态分布曲线(Bell曲线)
- 随机化正态分布数字的偏差(javascript)