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

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

感謝 java 分布 and 隨機數 離散 ability oss for

眾所周知。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個隨機數。跟維基百科的概率密度分布曲線相似,該方法應該有效。

正態分布因為是連續變量的分布。所以求其隨機變量比較困難,但能夠利用中心極限定理產生,下次再說吧。

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