2015-05-05 95 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; 
} 

它只使用簡單的算術運算,因此它應該相當快。

相關問題