首先是泊松分布,这是一个离散型的随机变量分布,比较好弄,此外例如考察一些到达事件的概率时,通常服从泊松分布,因此该分布相当实用。在开始编写之前,先感谢知乎一位大神的科普知识,假设有一个服从均匀分布的随机变量,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个随机数,跟*的概率密度分布曲线相似,该方法应该有效。
正态分布由于是连续变量的分布,所以求其随机变量比较困难,但可以利用中心极限定理产生,下次再说吧。