2012-04-30 183 views
2

在java中當我要生成一個高斯(Gaussien)值,我直接用生成隨機值1/X

Random r = new Random(); 
r.nextGaussian(); 

,但現在我想產生與1/X的概率,而不是高斯的值!

在我的解決方案,我必須創建一個隨機的值,但這些值開始由越接近於1和等(ordred)。 例如:

0.98 
0.90 
0.85 
0.6 
0.4 
... 

,而不是

0.3 
0.9 
0.4 
0.8 
... 

我們對Java的解決方案?

+2

'1/x',你的意思是統一概率嗎? – pablochan

+0

對不起pablochan,但我不知道你的意思是一致的概率,我只是想隨機生成幾個值,並生成一組這樣的值給像1/x一樣的圖! – Mehdi

+7

這是不可能的! 1/x以下的區域是無限的。 – huon

回答

-1
Random random = new SecureRandom(); 
double x = random.nextDouble(); 
return 1.0/x; 

會給你一個值1/X爲X的範圍爲[0.0,1.0]

編輯 - 不回答OP的問題,我誤解了。

+2

這與1/x概率的數字不一樣...... –

+0

SecureRamdom?!這對我來說是新的! SecureRandom和簡單的Ramdon有什麼區別? – Mehdi

+0

Oli - 嗯。你是對的,我的壞 - 應該認爲,通過正確:P – mcfinnigan

0

您可能需要實現自己的轉換方法。從隨機實例中,您可以獲得具有統一概率的數字的對象,並將這些數據用作您的方法的輸入,以將其轉換爲您喜歡的任何分佈。所以,你會採取生成的號碼,並用它來計算的1/X(不知道你的意思。)並返回,因爲你需要該操作的結果......

3

要找到的概率分佈的值1/x

1/x的積分是ln x,正如@dbaupp指出的那樣,它的增長沒有限制。事實上,當x接近0時,ln x的極限是無限的(負),隨着它向正無窮增長的極限是無限的(正)。

所以我們對我們的職能範圍限制在一定的時間間隔[min, max),其中min > 0無一不是有限的。

q = ln x倒數是x = e^q,所以位數功能是e^[(ln max - ln min)q + ln(min)],其中q落在間隔[0,1)

一點代數後,變成(max/min)^q * min = (max^q)(min^(1-q))

(我不知道哪形式更數值穩定)

所以,堵漏均勻分佈值範圍從0到1,如你會從nextDouble得到的,這個功能會給你一個值,並從給定的最小到最大:

public static double reciprocalQuantile(double q, double min, double max) { 
    return Math.pow(max, q)*Math.pow(min, 1-q); 
} 

所以,你可以說:

Random rand = new Random(); 
double value = reciprocalQuantile(rand.nextDouble(), 0.0001, 10000); 

我覺得:-)請隨時檢查我的數學。

還有一點:你當然可以設置min到Double.MIN_VALUE和最大翻番。MAX_VALUE,但我對浮點表示知之甚少,不知道這是否會產生問題,如果是的話,我不知道這樣做需要多少/多少個數。它可能也不是很有用。一點測試顯示了很多非常微小的值和很多非常大的值 - 這並不奇怪,因爲頂部和底部的積分無限大。因此,要在漂亮的直方圖中獲得足夠的middlish範圍內的值,您需要一個值爲