Java中利用Math.random()产生服从泊松分布的随机数
2014-07-13 21:20
435 查看
众所周知,Java的Math.random()产生的是服从均匀分布的随机数,但是其他分布的应用也相当广泛,例如泊松分布和高斯分布(正态分布),而这些分布Java没有很好的提供(高斯分布可以利用Random类),我们需要自己编写。
首先是泊松分布,这是一个离散型的随机变量分布,比较好弄,此外例如考察一些到达事件的概率时,通常服从泊松分布,因此该分布相当实用。在开始编写之前,先感谢知乎一位大神的科普知识,假设有一个服从均匀分布的随机变量,u~U[0,1],F(x)为随机变量x的累计分布函数,那么F-1(u)的变量服从F分布,即F的逆函数是服从F的随机变量。代码如下:
计算过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; }
计算过lamda分别为1,4,10的分布,产生1000个随机数,跟维基百科的概率密度分布曲线相似,该方法应该有效。
正态分布由于是连续变量的分布,所以求其随机变量比较困难,但可以利用中心极限定理产生,下次再说吧。
相关文章推荐
- Java中利用Math.random()产生服从泊松分布的随机数
- java Math.random()随机数的产生
- java 学习笔记 随机数产生的两种办法Math.random()和Random类
- JAVA中利用Math.random生成随机数
- java产生随机数(Math.random())
- java中的随机数(Math.random()),以及如何产生一个类似于[21,77]区间的随机数。
- 利用Math.Random()方法来生成随机数。(转)
- java常用类解析十一:Random类(Math.random())生成指定范围的随机数或字符
- java ---- 数学函数Math和随机产生数值Random
- java java.uitl.Random产生随机数
- 使用Java Math.random()利用蒙特卡洛方法计算pi值
- Java利用Math.random()方法随机生成A-Z的字符
- java常用类解析十一:Random类(Math.random())生成指定范围的随机数或字符
- 随机数的困惑(java.util.Random/Math.Random()
- Math.random()随机产生【x,y)的随机数
- JAVA基础MATH类的应用(Random产生自己想要的范围类的随机数解决方案)
- 随机数 java.util.Random与java.lang.Math.Random()-Java
- C#--利用Random类产生10个[10,99]之间的随机数,并将这10个随机数在列表框中显示出来,每个数占一项。用户选择某项后,在右边标签中显示所选内容
- 【Java】利用Collections类下的shuffle洗牌方法改进在一定的范围内产生不重复的随机数
- 15.幸运抽奖(利用random产生随机数)