9

rand()0 または 1 ( ) を生成するために使用していますrand() % 2。現在の時刻 ( ) を使用してシードしていsrand(time(NULL))ます。

rand()多くのデバッグを行った後、 16 回以上連続して偶数 (奇数) を返さないことに気付きました。

これは既知の問題ですか? Cに付属するより良いPRNGはありますか?

Visual Studio 2010 を使用して Windows 7 で実行しています。

4

4 に答える 4

14

を使用する代わりに、 をrand()%2試してくださいrand()>(RAND_MAX/2)rand()間隔 で一様であると仮定することしかできません[0, RAND_MAX]

編集:これは、コメントで Shahbaz によって提案されたもので、この回答を投稿した後に初めて気づきました。

編集: ArjunShankar は、私の以前の言い回しについて私に電話をかけました:

C99 標準から:

rand 関数は、0 から RAND_MAX までの範囲の一連の疑似乱数整数を計算します。

技術的には、均一性 (またはequidistributed ) は指定されていませんが、一般的に使用される PRNG (Mersenne Twister など) の実装に使用される事実上の標準です。これは、プログラマーが不均一な分布を持つカスタム PRNG を簡単に作成できるようにするためです。このプロパティがないと、プログラマはカスタム PRNG を最初から実装する必要があります。

于 2012-07-10T17:00:41.143 に答える
1

rand()吸うことで有名です。 random()(時々)少し良いですがdrand48()、その家族ははるかに優れています.

それ以上のものが必要な場合は、mersene twister または他の PRNG ライブラリを調べてください。または、必要に応じて十分なデータを提供できる場合は、 /dev/random を確認してください。

于 2012-07-10T16:55:00.950 に答える