2010-09-19 42 views
3

我試圖用對數分佈生成隨機數。Java:用對數分佈生成隨機數

其中n = 1的發生時間的一半中,n = 2時的時間的四分之一,n = 3時出現的時間的第八等

int maxN = 5; 
    int t = 1 << (maxN); // 2^maxN 
    int n = maxN - 
      ((int) (Math.log((Math.random() * t)) 
      /Math.log(2))); // maxN - log2(1..maxN) 
    System.out.println("n=" + n); 

大多數時間,我得到我需要的結果,但是每隔一段時間就會得到一個值大於maxN的值n

這是爲什麼?我看到它的方式,Math.random()的最大值是1.0;
因此最大值(Math.random() * t))t;因此,由於t = 2^maxN,所以log2(t)的最大值是maxN。

我的邏輯走向何處?

感謝

回答

6

小於1.0的對數是負數。當生成的隨機數小於1.0時,表達式((int) (Math.log(Math.random() * t)/Math.log(2)))是負數,因此maxN - (the negative number)大於maxN。

以下表達式應給出正確的分佈。

n = Math.floor(Math.log((Math.random() * t) + 1)/Math.log(2)) 

需要注意的是:

0.0 <= Math.random() <= 1.0 
0.0 <= Math.random() * t <= t 
1.0 <= (Math.random() * t) + 1 <= t + 1.0 
0.0 <= Math.log((Math.random() * t) + 1) <= Math.log(t + 1.0) 
0.0 <= Math.log((Math.random() * t) + 1)/Math.log(2) <= Math.log(t + 1.0)/Math.log(2) 

Since t = 2^maxN, 
Math.log(t + 1.0)/Math.log(2) is slightly larger than maxN. 

So do a Math.floor and you get the correct result: 
0.0 <= Math.floor(Math.log((Math.random() * t) + 1)/Math.log(2)) <= maxN 
+0

+1 @ abhin4v:感謝您的評論! – bguiz 2010-09-19 13:32:02

+0

我有支票,然後你拿了它! – 2010-09-19 13:47:11

+0

+ check @ abhin4v:你說得對log(t)/ log(2)> maxN 由於轉換爲int,錯誤是「隱藏的」,但這是一個更符合實際的正確方法。 – bguiz 2010-09-19 13:47:23

2

如果Math.random()*t是小於1,那麼你會當你把Math.log(Math.random()*t),通過對數的規則得到了否定的回答。這意味着當您除以Math.log(2)時,您會得到否定答案,因爲這是0.69314718055994530941723212145818。這是一個負數除以正數。答案是否定的。 maxN - 負數= maxN +正值,所以n大於maxN。爲了解決這個問題鑄造的Math.random()* T爲int,並添加1:

int n = maxN - 
     ((int) (Math.log((int)((Math.random() * t)+1)) 
     /Math.log(2))); // maxN - log2(1..maxN) 

通知日誌內的鑄造,並且1.

加入一種將所述的目的的添加避免0.不能取0的日誌。另外,不加1,你永遠不會在日誌中獲得maxN,因爲Math.random()永遠不會產生1.這樣,而不是得到1的一半,2,a第四,第三和第八,它只是從0開始。這給出了0,1,2,四分之一,2,8等。

+0

將小於1.0的數字投射到'int'將產生0,並記錄它將產生'-Infinity'。因此你的建議是不正確的。 – 2010-09-19 13:18:44

+0

@ abhin4v:你將如何解決這個問題..有沒有辦法做到這一點,而不使用if-then-else類型的構造? – bguiz 2010-09-19 13:23:17

+0

我剛剛解決了這個問題。 – 2010-09-19 13:23:43

1

的問題是在天平的另一端。

請考慮如果您得到一個非常隨機數會發生什麼。