10

私が理解していることから、標準ジェネレーターは正規分布用です。正規分布、一様分布、およびポアソン分布に従って乱数を生成する必要がありますが、最後の 2 つのクラスが見つからないようです。

0 ~ 999999 の範囲で生成する必要があります。

4

4 に答える 4

12

David が指摘したように、提供されている疑似乱数ジェネレーターは一様分布を使用します。

他の 2 つについては、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 ですが、これは微調整されています。必要なsdを掛けて、必要な平均を追加するだけです。たとえば、平均が 6 で標準偏差が 2.5 の正規分布値が必要な場合は、次のようにします。

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

ポアソン分布は明示的にサポートされていませんが、Tom の Python コードと同じことを行うことで偽装できます。

または、正規分布、ポアソン分布、およびその他の分布のユーティリティ クラスを提供するUncommons Maths ライブラリに興味があるかもしれません。

于 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 に答える