据我所知,标准发生器用于正态分布。我必须根据正态,均匀和泊松分布生成随机数,但我似乎找不到最后2个的类。
我必须在0 - 999999范围内生成它们。
答案 0 :(得分:12)
正如大卫所指出的那样,提供的伪随机数发生器使用均匀分布。
对于其他两个,我会使用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(λ))很好地近似。
答案 1 :(得分:6)
标准Java RNG(java.util.Random)及其子类(如java.security.SecureRandom)已生成均匀分布的值。
他们还有一个方法nextGaussian,它返回正态分布的值。默认情况下,分布的均值为零,标准差为1,但这是一个简单的调整。只需乘以所需的s.d.并添加所需的平均值。因此,例如,如果您想要平均值为6且标准差为2.5的正态分布值,则执行此操作:
double value = rng.nextGaussian() * 2.5 + 6;
未明确支持Poisson分布,但您可以通过与Tom's Python code相同的方式伪造它。
或者,您可能对我的Uncommons Maths library感兴趣,它提供了普通,泊松和其他分布的实用程序类。
答案 2 :(得分:5)
实际上,standard generator用于统一分配。任何语言/库中的基本随机数生成器总是(在所有情况下我都知道)使用均匀分布,因为这是所有流行的伪随机数生成器算法的结果 - 基本上,均匀的随机数是最简单的。
我看到Eddie已经指出了其他发行版的链接,所以我将跳过编写剩下的内容......
答案 3 :(得分:4)
让我先说明这一点,因为这些都不是真正的随机,我在谈论伪随机数生成器。
我还要说,我从来没有必要为生产质量代码这样做。我已经在Python中完成了这项工作。我模拟了泊松随机变量。
我这样做的方式是利用了以下事实:
特别是,您可以使用以下事实:如果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
我在这里发布了这个,因为很高兴知道这些关系存在,并且这种逆变换方法为您提供了一种处理在特定连续分布之后生成随机值的一般方法。