【问题标题】:Java Generator for Poisson and Uniform Distributions?用于泊松和均匀分布的 Java 生成器?
【发布时间】:2010-10-19 12:24:25
【问题描述】:

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

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

【问题讨论】:

    标签: java distribution generator random poisson


    【解决方案1】:

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

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

    【讨论】:

    • 实际上,该链接似乎也指出了创建法线变量的“nextGaussian”方法。
    【解决方案2】:

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

    我还要说,我从来没有为生产质量代码这样做过。不过,我已经在 Python 中为硬件分配做了这个。我模拟了泊松随机变量。

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

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

    特别是,您可以使用以下事实:如果 X1, ..., Xn 是独立的标准指数随机变量, 那么 Z = min(k : X1 + ... + Xk

    因此,我在 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
    

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

    【讨论】:

    • 我已将编号列表的格式设置为我认为您想要的。如果这不是您想要的,那么当然可以随时回滚更改。
    【解决方案3】:

    正如 David 所指出的,所提供的伪随机数生成器使用均匀分布。

    对于另外两个,我会使用 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(λ)) 很好地逼近。

    【讨论】:

    • 有没有办法指定他们使用的最小值和最大值?好像不是,从我看到的。
    • 这是因为泊松分布和正态分布没有最大值或最小值(好吧,泊松的最小值固定为 0)。
    • 您的两个链接现在是 404。:-(
    【解决方案4】:

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

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

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

    泊松分布不受明确支持,但您可以通过与Tom's Python code 相同的操作来伪造它。

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

    【讨论】:

    • Uncommons 的链接是 404。
    猜你喜欢
    • 2013-09-17
    • 2016-10-24
    • 2012-03-12
    • 1970-01-01
    • 2013-07-22
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多