是否有可能得到一个1-100之间的随机数,并将结果主要保持在40-60的范围内?我的意思是,它很少会超出这个范围,但我希望它主要在这个范围内……这是可能的JavaScript/jQuery?
现在我只使用基本的Math.random() * 100 + 1。
是否有可能得到一个1-100之间的随机数,并将结果主要保持在40-60的范围内?我的意思是,它很少会超出这个范围,但我希望它主要在这个范围内……这是可能的JavaScript/jQuery?
现在我只使用基本的Math.random() * 100 + 1。
当前回答
获取数字数组等并不是有效的。您应该采用一个映射,该映射采用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个,然后取平均值。这将结果拉向中心,但完全有可能到达边缘。
这个答案真的很好。但是我想针对不同的情况发布实现说明(我不懂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到1之间或多或少均匀分布的随机数源。 我希望产生一个遵循不同分布的随机数序列。
这个问题的一般解决方案是计算出所需分布的分位数函数,然后将分位数函数应用于均匀源的输出。
分位数函数是你想要的分布函数的积分的倒数。分布函数是这样的函数,曲线的一部分下面的面积等于随机选择的项目将在该部分的概率。
我在这里给出一个如何做到这一点的例子:
http://ericlippert.com/2012/02/21/generating-random-non-uniform-data/
其中的代码是c#编写的,但原则适用于任何语言;它应该很容易适应JavaScript的解决方案。
最好的方法是生成一个随机数,该随机数平均分布在某一组数字中,然后对0到100之间的集合应用投影函数,其中投影更有可能击中你想要的数字。
通常,实现这一点的数学方法是绘制所需数字的概率函数。我们可以用钟形曲线,但为了计算方便,我们还是用翻转抛物线吧。
我们画一条抛物线,使它的根在0和100处,而不使它倾斜。得到如下方程:
f(x) = -(x-0)(x-100) = -x * (x-100) = -x^2 + 100x
现在,曲线下0到100之间的所有面积都代表了我们想要生成数字的第一个集合。在那里,生成是完全随机的。我们要做的就是求出第一个集合的上界。
下界当然是0。上限是函数在100处的积分,也就是
F(x) = -x^3/3 + 50x^2
F(100) = 500,000/3 = 166,666.66666 (let's just use 166,666, because rounding up would make the target out of bounds)
所以我们知道我们需要生成一个介于0到166666之间的数字。然后,我们只需要把这个数字投影到我们的第二个集合,它在0到100之间。
我们知道我们生成的随机数是输入x在0到100之间的抛物线的积分。这意味着我们只需假设随机数是F(x)的结果,然后解出x。
在这种情况下,F(x)是一个三次方程,形式为F(x) = ax^3 + bx^2 + cx + d = 0,下列表述成立:
a = -1/3
b = 50
c = 0
d = -1 * (your random number)
为x解出这个问题会得到你所寻找的实际随机数,它保证在[0,100]范围内,并且更接近中心而不是边缘。