10

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

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

4

4 回答 4

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(λ)) 很好地近似。

于 2009-04-15T05:21:11.457 回答
6

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

他们还有一个方法nextGaussian,它返回正态分布的值。默认情况下,分布的均值为零,标准差为 1,但这只是微调。只需乘以所需的标准差并加上所需的平均值。因此,例如,如果您想要平均值为 6 且标准差为 2.5 的正态分布值,您可以这样做:

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

泊松分布不受明确支持,但您可以通过与Tom 的 Python 代码相同的方法来伪造它。

或者,您可能对我的Uncommons Math library感兴趣,它为 Normal、Poisson 和其他分布提供实用程序类。

于 2009-04-15T21:25:39.203 回答
5

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

我看到 Eddie 已经向您指出了其他发行版的链接,所以我将跳过编写其余部分...

于 2009-04-15T04:59:13.210 回答
4

让我以所有这些都不是真正随机的事实作为开头,我说的是伪随机数生成器。

我还要说,我从来没有为生产质量代码这样做过。不过,我已经在 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

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

于 2009-04-15T05:08:07.183 回答