我的问题:
如何在 Javascript 中创建具有给定均值和标准差 (sd) 的随机数列表?
示例:
我想创建一个列表,其中包含 1 到 10 之间的 5 个随机数。生成的平均值应为 5,标准差应为 2。
到目前为止我做了什么:
我的想法是(http://jsfiddle.net/QASDG/3/):
- 创建一个函数(名为“createData”)创建 1 到 10 之间的 5 个随机数并将它们放入“数组”
- 此函数还应计算这 5 个数字的平均值(和标准差)。
- 使用“do-while”循环:只要“平均值变为 5”(且“sd 变为 2”),就执行上述函数。但是当我调用 do-while 循环时,浏览器当然会崩溃,因为在很多情况下平均值为 != 5(而 sd != 2)。
注意:我还没有添加 SD,因为代码不是很优雅。
我从该站点找到了另一个脚本,其中指出:“这段代码的目标是生成一个集合,其中包含 5 个正态分布的随机数,均值为 1.0,标准差为 0.5。” http://rosettacode.org/wiki/Random_numbers#JavaScript .我尝试通过添加“Math.floor”并更改“for”循环 (i < 5) 中的条件来根据我的需要进行调整。
function randomNormal() {
return Math.floor(Math.cos(2 * Math.PI * Math.random()) * Math.sqrt(-2 * Math.log(Math.random())))
}
var a = []
for (var i=0; i < 5; i++){
a[i] = randomNormal() / 2 + 1
}
我想如何修改我的代码:
我不太确定我是否理解了这段代码的数学部分。根据该网页,它将创建一个正态分布(这很好但不是必需的)。所以我还需要的是:
- 我在哪里可以更改给定的均值和标准差(例如,均值 = 5,标准差 = 2)以创建随机数(满足这些属性)。
- 如何实现 1 到 10 之间的范围? (也许我可以使用类似的东西:Math.floor(Math.random()*10)+1)
非常感谢!
最佳答案
How can I create a list of random numbers with a given mean and standard deviation (sd) in JavaScript?
这似乎是一个关于随机创建一个数字列表的问题,该列表具有完全指定的 mean。和一个完全指定的 standard deviation (而不是关于从具有给定均值和 sd 的特定概率分布中抽取随机数的问题)。
一个直接的解决方案是绘制一个随机数列表,然后移动和缩放此列表以获得所需的均值和标准差,如 described in this answer来自 stats.stackexchange。
比如说,我们生成以下 5 个介于 1 和 10 之间的随机数:
4.527991433628388
6.3254986488276055
5.123502737960912
7.3331068522336125
9.069573681037484
此列表的平均值为 6.475934670737601
,标准差为 1.8102412442104023
。
然后,我们像这样转换列表中的每个数字:
newNum = newSD * (oldNum - oldMean) / oldSD + newMean
通过将新的均值设置为 5 并将新的标准差设置为 2,我们得到以下转换后的列表:
2.847863379160965
4.83379450402964
3.505799227476338
5.947025358346529
7.865517530986525
计算这个列表的均值和标准差确认它们确实是 5 和 2。
下面是在 JavaScript 中演示这种方法的代码:
// create a list of 5 random numbers between 1 and 10
var list = randomList(5, 1, 10);
// transform the list to have an exact mean of 5 and sd of 2
var newList = forceDescriptives(list, 5, 2);
// display the transformed list and descriptive statistics (mean and sd)
console.log('Transformed random list', newList, descriptives(newList));
// display the original list and descriptive statistics (mean and sd)
console.log('Original random list', list, descriptives(list));
/* demo functions */
function randomList(n, a, b) {
// create a list of n numbers between a and b
var list = [],
i;
for (i = 0; i < n; i++) {
list[i] = Math.random() * (b - a) + a;
}
return list;
}
function descriptives(list) {
// compute mean, sd and the interval range: [min, max]
var mean,
sd,
i,
len = list.length,
sum,
a = Infinity,
b = -a;
for (sum = i = 0; i < len; i++) {
sum += list[i];
a = Math.min(a, list[i]);
b = Math.max(b, list[i]);
}
mean = sum / len;
for (sum = i = 0; i < len; i++) {
sum += (list[i] - mean) * (list[i] - mean);
}
sd = Math.sqrt(sum / (len - 1));
return {
mean: mean,
sd: sd,
range: [a, b]
};
}
function forceDescriptives(list, mean, sd) {
// transfom a list to have an exact mean and sd
var oldDescriptives = descriptives(list),
oldMean = oldDescriptives.mean,
oldSD = oldDescriptives.sd,
newList = [],
len = list.length,
i;
for (i = 0; i < len; i++) {
newList[i] = sd * (list[i] - oldMean) / oldSD + mean;
}
return newList;
}
限制
请注意,由于浮点运算的精度限制,该演示有时会计算出精确的均值和 sd 略有偏差(例如 2.0000000000000004
而不是 2
).另请注意,根据所需的均值和 sd,可能无法生成所需范围内的数字列表,如 this answer 中所述。在 math.stackexchange 上。这意味着转换后的列表可能与原始列表处于非常不同的范围内。另请注意,可能无法从具有给定整数均值和整数 sd 的给定范围生成随机整数列表。
关于Javascript:生成具有固定均值和标准差的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22619719/