是否有可能得到一个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来得到在你的范围中间值最多的分布。
其他回答
这个答案真的很好。但是我想针对不同的情况发布实现说明(我不懂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个范围,生成该范围内的随机数。
性能优化的附加说明。范围不需要按升序或降序排列,所以为了更快的范围查找,权重最高的范围应该排在前面,权重最低的范围应该排在最后。
它看起来很蠢,但你可以使用两次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;
}
分布
5% for [ 0,39]
90% for [40,59]
5% for [60,99]
解决方案
var f = Math.random();
if (f < 0.05) return random(0,39);
else if (f < 0.95) return random(40,59);
else return random(60,99);
通用解决方案
random_choose([series(0,39),series(40,59),series(60,99)],[0.05,0.90,0.05]);
function random_choose (collections,probabilities)
{
var acc = 0.00;
var r1 = Math.random();
var r2 = Math.random();
for (var i = 0; i < probabilities.length; i++)
{
acc += probabilities[i];
if (r1 < acc)
return collections[i][Math.floor(r2*collections[i].length)];
}
return (-1);
}
function series(min,max)
{
var i = min; var s = [];
while (s[s.length-1] < max) s[s.length]=i++;
return s;
}
你可以使用一个辅助随机数来决定是否生成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到1之间或多或少均匀分布的随机数源。 我希望产生一个遵循不同分布的随机数序列。
这个问题的一般解决方案是计算出所需分布的分位数函数,然后将分位数函数应用于均匀源的输出。
分位数函数是你想要的分布函数的积分的倒数。分布函数是这样的函数,曲线的一部分下面的面积等于随机选择的项目将在该部分的概率。
我在这里给出一个如何做到这一点的例子:
http://ericlippert.com/2012/02/21/generating-random-non-uniform-data/
其中的代码是c#编写的,但原则适用于任何语言;它应该很容易适应JavaScript的解决方案。