2012-07-13 51 views
4

在此先感謝您的幫助。Java:根據用戶定義的函數生成隨機數

我需要創建隨Java中用戶定義函數的隨機數。這樣做的一般方法是通過對函數的積分應用均勻分佈。問題是我需要創建不能整合的功能分配,或者整體非常複雜或混亂。

一個例子是生成將遵循該函數的分佈隨機數:

f(x) = (cos(x))^1.5 

有沒有在Java中的任何數學函數庫,你可以定義一個函數,它返回的隨機數? 有什麼建議嗎?

非常感謝!

+2

你可以在數值上近似CDF嗎? – 2012-07-13 18:05:41

+0

你有關於該功能的更多信息?你知道函數的定義域嗎?它是否有界? – GL770 2012-07-13 19:30:36

+0

我正在尋找從用戶定義的函數中創建隨機數的一般方法,我寫的函數只是一個。無論如何,在我的一般情況下,它可能是有界的,以防它幫助... – beethovenj 2012-07-13 20:00:33

回答

1

道歉,如果我重複你已經知道:

您需要的用戶定義(或近似)逆CDF。如果你不能計算它,我會建議從你的分佈中抽樣,然後用一個衆所周知的分佈來近似它。我不知道有哪些庫會從PDF中爲你做這件事。一旦你有了這些,你可以創建一個映射,從你的隨機數發生器在你的語言中的統一隨機性到函數。當您生成一個隨機數時,該隨機數將用作用戶函數映射回該值的百分位數(例如.5 = 50% - >正態分佈的均值)。

+0

非常感謝這麼多人。問題是我正在處理科學數據,我想盡可能地避免近似值,這就是問題......無論如何,如果我有兩個人都會解決我的問題可以使用近似值,所以再次感謝。 – beethovenj 2012-07-13 18:41:25

1

對分佈進行抽樣的另一種方法是在PDF的域和範圍內選擇一個隨機點(統一)。如果該點低於PDF曲線,請將其返回。否則丟棄它,然後再試一次。

這比評估反CDF要慢,因爲你必須多次採樣。樣品的預期數是2 /(d· - [R),其中d是域,和- [R PDF的範圍。

abstract class Distribution { 
    public abstract double PDF(double value); 
    public abstract double getDomainMin(); 
    public abstract double getDomainMax(); 
    public abstract double getRangeMax(); 

    protected Random rnd; 

    public Distribution() { 
     rnd = new Random(); 
    } 

    public double sample() 
    { 
     double left = getDomainMin(); 
     double right = getDomainMin(); 
     double top = getRangeMax(); 

     double x, y1, y2; 
     while (true) { 
      x = left + (right - left) * rnd.nextDouble(); 
      y1 = top * rnd.nextDouble(); 
      y2 = PDF(x); 
      if (y1 <= y2) return x; 
     } 
     return Double.NaN; 
    } 
} 
+0

mmm ...這很有意義...我會嘗試,讓我們看看結果... – beethovenj 2012-07-14 00:33:46