是否有可能得到一个1-100之间的随机数,并将结果主要保持在40-60的范围内?我的意思是,它很少会超出这个范围,但我希望它主要在这个范围内……这是可能的JavaScript/jQuery?

现在我只使用基本的Math.random() * 100 + 1。


当前回答

我建议使用beta分布来生成一个0-1之间的数字,然后将其放大。它非常灵活,可以创建许多不同形状的发行版。

这里有一个快速而粗略的样本:

rbeta = function(alpha, beta) {
 var a = 0   
 for(var i = 0; i < alpha; i++)   
    a -= Math.log(Math.random())

 var b = 0   
 for(var i = 0; i < beta; i++)   
    b -= Math.log(Math.random())

  return Math.ceil(100 * a / (a+b))
}

其他回答

这个答案真的很好。但是我想针对不同的情况发布实现说明(我不懂JavaScript,所以我希望你能理解)。


假设每个范围都有范围和权重:

ranges - [1, 20], [21, 40], [41, 60], [61, 100]
weights - {1, 2, 100, 5}

初始静态信息,可以缓存:

所有权重之和(样本为108) 范围选择边界。基本上就是这个公式:Boundary[n] = Boundary[n - 1] + weight [n - 1] and Boundary[0] = 0。样本的边界为{0,1,3,103,108}

一代数量:

从范围[0,所有权重之和]生成随机数N。 For (i = 0;i < size(border) && N > border [i + 1];+ + i) 取第i个范围,生成该范围内的随机数。


性能优化的附加说明。范围不需要按升序或降序排列,所以为了更快的范围查找,权重最高的范围应该排在前面,权重最低的范围应该排在最后。

获取数字数组等并不是有效的。您应该采用一个映射,该映射采用0到100之间的随机数,并映射到所需的分布。在这个例子中,你可以取f(x)=-(1/25)x2+4x来得到在你的范围中间值最多的分布。

你可以使用一个辅助随机数来决定是否生成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); }

当然这是可能的。随机抽取1-100。如果数字<30,则在1-100范围内生成数字,如果不在40-60范围内生成数字。

如果你可以使用高斯函数,那就使用它。这个函数返回平均值为0和sigma 1的正态数。

95%的数字在平均+/- 2*sigma范围内。平均值= 50,sigma = 5

randomNumber = 50 + 5*gaussian()