8

ランダムなポアソン分布数(以下のJava)を生成するためのKnuthのアルゴリズムを知っていますが、それgenerateEvent()を時間の経過とともにランダムにメソッドを呼び出すように変換するにはどうすればよいですか?

int poissonRandomNumber(int lambda) {
    double L = Math.exp(-lambda);
    int k = 0;
    double p = 1;
    do {
        k = k + 1;
        double u = Math.random();
        p = p * u;
    } while (p > L);
    return k - 1;
}
4

2 に答える 2

4

イベント間の到着時間をシミュレートする場合は、指数分布が必要です。

疑似乱数ジェネレーター - 指数分布を見てください。

コードは次のようになります。

// Note L == 1 / lambda
public double poissonRandomInterarrivalDelay(double L) {
    return (Math.log(1.0-Math.random())/-L;
}

...

while (true){
    // Note -- lambda is 5 seconds, convert to milleseconds
    long interval= (long)poissonRandomInterarrivalDelay(5.0*1000.0);
    try {
        Thread.sleep(interval);
        fireEvent();
}
于 2011-04-10T23:59:17.520 に答える
0

Scott が述べたように、生成しているポアソン乱数は、イベントの頻度を表します。頻度がわかったら、2 番目の分布、たとえば Uniform を使用して、間隔全体に発生を適合させることができます。

N の間隔で生成されるイベントの数が k であるとします。次に、合計が N になる (k+1) 個の乱数を生成するだけです。

|<---------------------- N ------------------------ ->|
--r_0--(イベント)---r_1-..-(イベント_k)--r_(k+1)--

これを行うには、単純に (k+1) 個の乱数を生成し、それらの合計を N で割った値で割ります。これらの数の最初の k がイベントのタイムスタンプになります。

于 2013-11-15T03:22:40.757 に答える