我試圖用對數分佈生成隨機數。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。
我的邏輯走向何處?
感謝
+1 @ abhin4v:感謝您的評論! – bguiz 2010-09-19 13:32:02
我有支票,然後你拿了它! – 2010-09-19 13:47:11
+ check @ abhin4v:你說得對log(t)/ log(2)> maxN 由於轉換爲int,錯誤是「隱藏的」,但這是一個更符合實際的正確方法。 – bguiz 2010-09-19 13:47:23