2012-11-07 129 views
2

可能重複:
Generate random number with non-uniform density隨機數,具有不均勻分佈

我試圖確定/創建給我數的不均勻分佈序列的功能(在Java中)。 如果我有說function f(x), and x>0的功能,它會給我一個隨機數 從0x

該函數最適用於任何給定的x,下面的這個例子只是我想要的一個例子。

但是,如果我們說x=100函數f(x)將返回s nonunifrom分佈。

而且我想例如說

0 to 20全部案件的20%左右。

21 to 50是所有案件約50%。

51 to 70是所有案件約20%。

71 to 100爲大約10的所有情況。

簡而言之,給我一個像正常分佈的數字,它偷看在30-40在這種情況下x100

http://en.wikipedia.org/wiki/Normal_distribution

(我可以用一個統一的隨機根的分數,如果需要,也只有一個功能,將transfrom統一的結果,以不均勻的結果。)

編輯

我對這個問題的最終解決方案是:

/** 
* Return a value from [0,1] and mean as 0.3, It give 10% of it is lower 
* then 0.1. 5% is higher then 0.8 and 30% is in rang 0.25 to 0.45 
* 
* @return 
*/ 
public double nextMyGaussian() { 
    double d = -1000; 
    while (d < -1.5) { 
     // RANDOMis Java's normal Random() class. 
     // The nextGaussian is normal give a value from -5 to +5? 
     d = RANDOM.nextGaussian() * 1.5; 
    } 
    if (d > 3.5d) { 
     return 1; 
    } 
    return ((d + 1.5)/5); 
} 

回答

2

你可以寫一個函數,它將一系列隨機數和它的1-X範圍相加並取平均值?這將趨向於正態分佈N增加

參見:

Generate random numbers following a normal distribution in C/C++

我砍死像下面:

class CrudeDistribution { 

    final int TRIALS = 20; 

    public int getAverageFromDistribution(int upperLimit) { 
     return getAverageOfRandomTrials(TRIALS, upperLimit); 
    } 

    private int getAverageOfRandomTrials(int trials, int upperLimit) { 
     double d = 0.0; 
     for (int i=0; i<trials; i++) { 
      d +=getRandom(upperLimit); 
     } 
     return (int) (d /= trials); 
    } 

    private int getRandom(int upperLimit) { 
     return (int) (Math.random()*upperLimit)+1; 
    } 
} 

有圖書館共享,數學,可以產生分佈基於平均值和標準偏差(即衡量價差)。並在鏈接一些算法,這樣做。

大概是這樣的狩獵找到相關的2襯墊樂趣小時:

https://commons.apache.org/math/userguide/distribution.html

+0

有Math.nextGaussian(),但它使用一個標準偏差,並可能會生成一個無限大的數字,需要bucketing。 – Alex

+0

爲什麼'CrudeDistribution'和'TRIALS'包的範圍? –

+0

我認爲這是最接近這個問題的帖子。 'Steve Kuo'沒關係,可能不是純Java代碼。 –

4

一個簡單的解決方案是產生第一隨機數0至9和

0表示10個第一百分比,1十個個以下百分比等

因此,如果你得到0或1,則產生0和之間的第二隨機數20.如果得到2,3,4,5或6,則生成21和50之間,第二隨機數等

+0

是的,但對不起,我認爲這不是一個好方法,基於我的'x'可以是從零到大數的所有值。 –

+1

好吧,用'0和x/5'之間的'0和20之間的'來代替',並且你有相同的結果。 –

+0

好的一點,這也許工作,但我跳躍使用數學函數而不是邏輯函數。 –

0

一個解決辦法是做1-100和基於該結果之間的隨機數做在適當範圍內的另一個隨機數。

1-20 - > 0-20

21-70 - > 21-50

71-90 - > 51-70

91-100 - > 71-100

希望有道理。

+0

如果你解釋它是如何滿足要求的話,這可能是有意義的。從這個角度來看,這並不完全清楚。 –

0

你需要(X)首先創建F。

假設值x是等概率的,你的F(X)是

double f(x){ 
if(x<=20){ 
return x; 
}else if (x>20 && x<=70){ 
return (x-20)/50*30+20; 
} else if(... 

0

只是產生一束,說至少30,均勻隨機數0和x之間。然後採取那些的意思。均值將遵循中心極限定理,是一個以x/2爲中心的正態分佈的隨機數。