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

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


当前回答

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

其他回答

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

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

randomNumber = 50 + 5*gaussian()

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

最简单的方法是从0-50中生成两个随机数,然后将它们相加。

这给出了偏向50的分布,就像滚动两个骰子偏向7一样。

事实上,通过使用更大数量的“骰子”(如@Falco所建议的),你可以更接近钟形曲线:

function weightedRandom(max, numDice) {
    let num = 0;
    for (let i = 0; i < numDice; i++) {
        num += Math.random() * (max/numDice);
    }    
    return num;
}

JSFiddle: http://jsfiddle.net/797qhcza/1/

几年前,我需要解决这个问题,我的解决方案比其他任何答案都要简单。

我在边界之间随机生成3个,然后取平均值。这将结果拉向中心,但完全有可能到达边缘。

它看起来很蠢,但你可以使用两次rand:

var choice = Math.random() * 3;
var result;

if (choice < 2){
    result = Math.random() * 20 + 40; //you have 2/3 chance to go there
}
else {
    result = Math.random() * 100 + 1;
}