1

ランダム性のアルゴリズムに関して助けが必要です。だから問題は。

8 時間の間に 50 のイベントが発生します。イベントはランダムな時間に発生する可能性があります。これは、毎秒 50/(8*60*60)= .001736 のイベントが発生する可能性があることを意味します。ランダム生成アルゴリズムでこれを行うにはどうすればよいですか?

乱数を取得できます

int r = rand();
double chance = r/RAND_MAX;
if(chance < 0.001736)
    then event happens
else
    no event

しかし、ほとんどの場合、rand() は 0 および 0<0.001736 を返し、必要以上のイベントを取得しています。

助言がありますか?


申し訳ありませんが、チャンスをダブルチャンスとして計算したことを忘れてしまいました = (static_cast )(r) / (static_cast)(RAND_MAX);


static_castからダブルを削除しました

ダブルチャンス = (ダブル)r/(ダブル)(RAND_MAX);

4

5 に答える 5

7

rとはどちらRAND_MAXも整数なので、式は

double chance = r / RAND_MAX;

整数演算で計算されます。試す:

double chance = 1.0 * r / RAND_MAX;

これにより、除算が浮動小数点除算になります。

ただし、より良い解決策は、最初に浮動小数点値を返すランダム関数を使用することです。整数乱数ジェネレーターを使用すると、確率計算でバイアス エラーが発生します。

于 2008-11-13T19:57:04.417 に答える
7

1 秒ごとにイベントが発生するかどうかを選択すると、0 イベントが発生するか、8*60*60 イベントが発生するかの変化があります。50 のイベントが制約である場合は、8 時間の間に 50 のランダムな時間を選択し、それらを保存します。

于 2008-11-13T19:58:17.533 に答える
2
  • 50 個の数字のリストを作成します。
  • 1 から 8 * 60 * 60 までの乱数を入力してください。
  • それらを並べ替える

そして、あなたは50秒を持っています。

重複する可能性があることに注意してください。

于 2008-11-13T19:58:40.513 に答える
2

ちょうど 50 人ですか、それとも平均 50 人ですか。

Exponential 分布を調べて、それをサポートする言語のライブラリを見つけたいと思うかもしれません。

指数分布は、指定された平均レートでランダムに発生するイベント間の間隔を示します。

次のように、均一な RNG を使用して「偽造」できます。

    double u;
    do
    {
        // Get a uniformally-distributed random double between
        // zero (inclusive) and 1 (exclusive)
        u = rng.nextDouble();
    } while (u == 0d); // Reject zero, u must be +ve for this to work.
    return (-Math.log(u)) / rate;
于 2008-11-13T20:17:23.657 に答える
0

28,800 の要素リストを作成し、そこから 50 の要素を取り出して、イベントの時間を特定してみませんか? これは、2 つのイベントが同時に発生することはなく、各イベントに 1 秒かかることを前提としています。乱数ジェネレーターを使用して 0 ~ x の整数値を生成し、制限内で選択できるようにすることができます。

于 2008-11-13T19:58:50.497 に答える