Java中利用Math.random()產生服從泊松分布的隨機數
阿新 • • 發佈:2017-08-04
感謝 java 分布 and 隨機數 離散 ability oss for
眾所周知。Java的Math.random()產生的是服從均勻分布的隨機數,可是其它分布的應用也相當廣泛,比如泊松分布和高斯分布(正態分布)。而這些分布Java沒有非常好的提供(高斯分布能夠利用Random類),我們須要自己編寫。
計算過lamda分別為1,4,10的分布,產生1000個隨機數。跟維基百科的概率密度分布曲線相似,該方法應該有效。
首先是泊松分布,這是一個離散型的隨機變量分布。比較好弄,此外比如考察一些到達事件的概率時,通常服從泊松分布,因此該分布相當有用。在開始編寫之前,先感謝知乎一位大神的科普知識。如果有一個服從均勻分布的隨機變量。u~U[0,1],F(x)為隨機變量x的累計分布函數,那麽F-1(u)的變量服從F分布。即F的逆函數是服從F的隨機變量。代碼例如以下:
<span style="white-space:pre"> </span>private static int getPossionVariable(double lamda) { int x = 0; double y = Math.random(), cdf = getPossionProbability(x, lamda); while (cdf < y) { x++; cdf += getPossionProbability(x, lamda); } return x; } private static double getPossionProbability(int k, double lamda) { double c = Math.exp(-lamda), sum = 1; for (int i = 1; i <= k; i++) { sum *= lamda / i; } return sum * c; }
正態分布因為是連續變量的分布。所以求其隨機變量比較困難,但能夠利用中心極限定理產生,下次再說吧。
Java中利用Math.random()產生服從泊松分布的隨機數