2015-05-05 175 views
0

我正在尝试生成1和最大值之间的随机数。这个我没有问题,这样做并用以下操作:在权重/偏差范围内生成一个随机数?

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

然而,在理想的情况下,我想1和我的最大值之间产生了一些,不过较低的数字有较高的概率发生。我希望变量偏向1,但是我的数学技能还不够强大,如果有人能指出我正确的方向,那将是非常好的。

谢谢

乔希

回答

1

一个简单的方法将是刚方的Math.random的结果()。由于函数的结果在0和1之间,所以正方形也将在[0,1]的范围内,但是例如0.5的值将映射到较低的值--0.25。您可以尝试1以上的功率,直到找到可接受的功能。

1

我得到了一个java代码,它可以做你想做的事情。 你应该为int [] prob数组选择你自己的概率。 我认为它不会很难将其翻译为js或构建水平。等于。

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)]; 
} 
0

这是一个非常普遍的问题。首先考虑这个链接这里 http://en.wikipedia.org/wiki/List_of_probability_distributions#Supported_on_a_bounded_interval 它显示了一些概率函数是有界的,我相信你正在寻找(自min = 1和max = max)。 您也可以选择一个半无限区间,并忽略超过最大值的所有值。我认为,这也可以接受,取决于您的应用程序。

接下来,选择一个最适合您的概率函数。为了简单起见,我通过反转CDF选择了三角分布

的分布函数是(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) 

,以便可以通过一个均匀分布生成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

0

以下功能我做了让你接近一个偏置随机NU mber

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

它只使用简单的算术运算,因此它应该相当快。

相关问题