获取一个专注于中心的随机数

2022-08-30 00:40:49

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

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


答案 1

最简单的方法是从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;
}

Weighted random numbers

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


答案 2

您在这里有一些很好的答案,可以给出具体的解决方案;让我为您描述一般解决方案。问题是:

  • 我有一个或多或少均匀分布的随机数的来源,介于0和1之间。
  • 我希望生成一个遵循不同分布的随机数序列。

这个问题的一般解决方案是计算出所需分布的分位数函数,然后将分位数函数应用于均匀源的输出。

分位数函数是所需分布函数积分的反函数。分布函数是曲线一部分下的面积等于随机选择的项目位于该部分中的概率的函数。

我在这里举一个如何做到这一点的例子:

http://ericlippert.com/2012/02/21/generating-random-non-uniform-data/

其中的代码是C#,但原则适用于任何语言;使解决方案适应JavaScript应该很简单。