在具有权重/偏差的范围之间生成随机数?

时间:2015-05-05 14:03:27

标签: javascript web-applications random

我正在尝试生成1到最大值之间的随机数。这样做我没有遇到任何问题,并且执行以下操作:

var max = 200;    
var randomNumber = Math.floor(Math.random() * max) + 1;

然而,在理想情况下,我想生成介于1和最大值之间的数字,但是较低的数字具有较高的发生概率。我希望变量偏向1.然而,我的数学技能不够强大,无法解决这个问题,如果有人能指出我正确的方向,那就太棒了。

谢谢,

约什

4 个答案:

答案 0 :(得分:1)

一种简单的方法就是将Math.random()的结果平方。由于函数的结果在0和1之间,因此正方形也将在[0,1]的范围内,但是例如从它的值0.5将被映射到较低的值 - 0.25。您可以尝试使用大于1的功率,直到找到可接受的功能。

答案 1 :(得分:1)

我在java中得到了一个代码,可以满足您的需求。 您应该为int [] prob数组选择自己的概率。 我认为将此翻译成js或构建smth并不难。相等。

int[] probs;

void initRandom(int n, int[] probabilities)
{
    int i,j,begin=0,end=0,sum=0;
    int[] probs;
    // sum of all propabilitys must be 100% 
    for(i=0;i<probabilities.length;i++) sum+=probabilities[i];
    probs=new int[sum];
    // fills numbers from 0 till n-1 in regard to their probabilities
    // to the probability array.

     for(i=0;i<n;i++)
     {
         begin=end;
         end+=probabilities[i];
         for(j=begin;j<end;j++) probs[j]=i;
     }
}

int genRandom()
{
    return probs[smallRand(probs.length-1)];
}

答案 2 :(得分:0)

这是一个非常普遍的问题。首先考虑此链接 http://en.wikipedia.org/wiki/List_of_probability_distributions#Supported_on_a_bounded_interval 它显示了一些有界的概率函数,我相信这就是你要找的东西(因为min = 1和max = max)。 您还可以选择半infine区间,并忽略高于最大值的所有值。我认为,这也可以接受,具体取决于您的应用。

接下来,选择最适合您的其中一种概率函数。为简单起见,我选择了三角分布

分发函数是(PDF和CDF)

f(x) = 2/(2*max-1-max^2)*(x-max)
F(x) = 2/(2*max-1-max^2)*(0.5*x^2-max*x-0.5+max)

所以我可以通过反转CDF(如

)从0-1的均匀分布产生偏差分布
var urand = Math.random();
var a = 2/(2*max-1-max^2);
var randomNumber = max-Math.sqrt(max*max-2*(max-urand/a-0.5));

干杯 [R

答案 3 :(得分:0)

我编写的以下功能为您提供了近乎偏向的随机数

function rand(max) {
    var r = Math.random();
    r = 1/(101-100 * r);
    return Math.floor(r * max) - 1;
}

它只使用简单的算术,因此它应该非常快。