是否有可能得到一个1-100之间的随机数,并将结果主要保持在40-60的范围内?我的意思是,它很少会超出这个范围,但我希望它主要在这个范围内……这是可能的JavaScript/jQuery?
现在我只使用基本的Math.random() * 100 + 1。
是否有可能得到一个1-100之间的随机数,并将结果主要保持在40-60的范围内?我的意思是,它很少会超出这个范围,但我希望它主要在这个范围内……这是可能的JavaScript/jQuery?
现在我只使用基本的Math.random() * 100 + 1。
当前回答
生成这样的随机数有很多不同的方法。一种方法是计算多个均匀随机数的和。你和多少个随机数以及它们的范围将决定最终分布的样子。
你加起来的数字越多,它就越向中心倾斜。在你的问题中已经提出了使用1个随机数的和,但正如你注意到的那样,它并不偏向于范围的中心。其他答案建议使用2个随机数的和或3个随机数的和。
通过取更多随机数的和,你可以得到更偏向范围中心的结果。在极端情况下,你可以取99个随机数字的和,每个数字都是0或1。这是一个二项分布。(二项分布在某种意义上可以被看作是正态分布的离散版本)。理论上,这仍然可以覆盖整个范围,但它有很大的偏向中心,你永远不会期望看到它到达端点。
这种方法意味着你可以调整你想要的偏差。
其他回答
生成这样的随机数有很多不同的方法。一种方法是计算多个均匀随机数的和。你和多少个随机数以及它们的范围将决定最终分布的样子。
你加起来的数字越多,它就越向中心倾斜。在你的问题中已经提出了使用1个随机数的和,但正如你注意到的那样,它并不偏向于范围的中心。其他答案建议使用2个随机数的和或3个随机数的和。
通过取更多随机数的和,你可以得到更偏向范围中心的结果。在极端情况下,你可以取99个随机数字的和,每个数字都是0或1。这是一个二项分布。(二项分布在某种意义上可以被看作是正态分布的离散版本)。理论上,这仍然可以覆盖整个范围,但它有很大的偏向中心,你永远不会期望看到它到达端点。
这种方法意味着你可以调整你想要的偏差。
获取数字数组等并不是有效的。您应该采用一个映射,该映射采用0到100之间的随机数,并映射到所需的分布。在这个例子中,你可以取f(x)=-(1/25)x2+4x来得到在你的范围中间值最多的分布。
var randNum;
// generate random number from 1-5
var freq = Math.floor(Math.random() * (6 - 1) + 1);
// focus on 40-60 if the number is odd (1,3, or 5)
// this should happen %60 of the time
if (freq % 2){
randNum = Math.floor(Math.random() * (60 - 40) + 40);
}
else {
randNum = Math.floor(Math.random() * (100 - 1) + 1);
}
如果你可以使用高斯函数,那就使用它。这个函数返回平均值为0和sigma 1的正态数。
95%的数字在平均+/- 2*sigma范围内。平均值= 50,sigma = 5
randomNumber = 50 + 5*gaussian()
你可以使用一个辅助随机数来决定是否生成40-60或1-100的随机数:
// 90%的随机数应该在40到60之间。 Var weight_percentage = 90; var focuse_on_center = ((Math.random() * 100) < weight_percentage); 如果(focuse_on_center) { //生成40-60范围内的随机数。 alert (40 + Math.random() * 20 + 1); } 其他的 { //生成1-100范围内的随机数。 alert (Math.random() * 100 + 1); }