1. 程式人生 > >Java中利用Math.random()產生服從泊松分佈的隨機數

Java中利用Math.random()產生服從泊松分佈的隨機數

眾所周知,Java的Math.random()產生的是服從均勻分佈的隨機數,但是其他分佈的應用也相當廣泛,例如泊松分佈和高斯分佈(正態分佈),而這些分佈Java沒有很好的提供(高斯分佈可以利用Random類),我們需要自己編寫。

       首先是泊松分佈,這是一個離散型的隨機變數分佈,比較好弄,此外例如考察一些到達事件的概率時,通常服從泊松分佈,因此該分佈相當實用。在開始編寫之前,先感謝知乎一位大神的科普知識,假設有一個服從均勻分佈的隨機變數,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;
	}
計算過lamda分別為1,4,10的分佈,產生1000個隨機數,跟維基百科的概率密度分佈曲線相似,該方法應該有效。

正態分佈由於是連續變數的分佈,所以求其隨機變數比較困難,但可以利用中心極限定理產生,下次再說吧。