用于泊松和均匀分布的Java生成器?

据我所知,标准发生器用于正态分布。 我必须根据正态,均匀和泊松分布生成随机数,但我似乎找不到最后2个的类。

我必须在0 – 999999范围内生成它们。

正如David指出的那样,提供的伪随机数生成器使用Uniform分布。

对于另外两个,我会使用Cern Colt库函数:

  • 泊松
  • 正常/高斯

这些库函数很容易让你找到从每个分布中获取的随机数,而不是给你一个概率密度函数或累积密度函数,并期望你自己推导出这个数字(这似乎是Apache Commons-Math方法):

RandomEngine engine = new DRand(); Poisson poisson = new Poisson(lambda, engine); int poissonObs = poisson.nextInt(); Normal normal = new Normal(mean, variance, engine); double normalObs = normal.nextDouble(); 

另外,请记住,大λ的泊松分布P(λ)可以通过正态分布N(λ,sqrt(λ))很好地近似。

标准Java RNG( java.util.Random )及其子类(如java.security.SecureRandom )已生成均匀分布的值。

它们还有一个方法nextGaussian ,它返回正态分布的值。 默认情况下,分布的均值为零,标准差为1,但这很简单。 只需乘以所需的sd并添加所需的平均值即可。 因此,例如,如果您想要平均值为6且标准差为2.5的正态分布值,则执行以下操作:

 double value = rng.nextGaussian() * 2.5 + 6; 

Poisson分布没有明确支持,但您可以通过与Tom的Python代码相同来伪造它。

或者,您可能对我的Uncommons Maths库感兴趣,该库提供Normal,Poisson和其他分布的实用程序类。

实际上, 标准发生器用于均匀分布。 任何语言/库中的基本随机数生成器将始终(在所有情况下我都知道)使用均匀分布,因为这是所有流行的伪随机数生成器算法的结果 – 基本上,均匀随机数是最简单的。

我看到Eddie已经指向了其他发行版的链接,所以我将跳过编写剩下的内容……

让我先说一下这一点,因为这些都不是真正的随机,我在谈论伪随机数生成器。

我还要说,我从来没有必要为生产质量代码这样做。 我已经在Python中完成了这项工作。 我模拟了泊松随机变量。

我这样做的方式利用了以下事实:

  1. 泊松随机变量是指数随机变量的总和。
  2. 我们可以使用逆变换方法来生成指数随机变量。 http://en.wikipedia.org/wiki/Inverse_transform_sampling

特别是,您可以使用以下事实:如果X 1 ,…,X n是独立的标准指数随机变量,那么Z = min(k:X 1 + … + X k <λ) - 1是泊松(λ)。

那么,有了这个,我在python中编写了以下代码来生成泊松值:

 class Poisson: """Generate Poisson(lambda) values by using exponential random variables.""" def __init__(self, lam): self.__lam = lam def nextPoisson(self): sum = 0 n = -1 while sum < self.__lam: n += 1 sum -= math.log(random.random()) return n 

该类的示例用法是:

 # Generates a random value that is Poisson(lambda = 5) distributed poisson = Poisson(5) poisson_value = poisson.nextPoisson 

我在这里发布了这个,因为很高兴知道存在这些类型的关系,并且这种逆变换方法为您提供了一种处理在特定连续分布之后生成随机值的一般方法。