3

この質問の言い回しはよくわかりませんが、他にそのような質問は見つかりませんでした。

私がこのコードを持っているとしましょう:

srand(1);
srand(SOME_DEFINED_CONST_INT);

この実行可能ファイルを複数の異なる物理マシンで実行した場合、rand()それらの間でシーケンスの一貫性が保証されますか?つまり、1, 4, 6, 3, 41台のマシンに乗った場合、他のマシンでも同じシーケンスを常に取得できますか?

はいの場合、それをどのように証明できますか?それは標準の一部ですか?

いいえの場合、それを実現するために私にできることはありますか?

4

4 に答える 4

3

いいえ、規格はそのようなことを保証していません。ただし、乱数を生成するロジックは、C標準ライブラリ内にあります。したがって、同じバージョンのライブラリを使用してアプリケーションをビルドする場合、シーケンスは同じである必要があります。私の答えの2番目の部分は単なる推測ですが、標準は間違いなく保証を与えていません。

于 2011-03-09T10:41:44.467 に答える
3

アーメンが言ったように、それは非標準です。ただし、Linuxのmanページをsrand()見ると、興味深いことがわかります。

POSIX 1003.1-2003は、rand()とsrand()の実装の次の例を示しています。これは、2つの異なるマシンで同じシーケンスが必要な場合に役立つ可能性があります。

       static unsigned long next = 1;

       /* RAND_MAX assumed to be 32767 */
       int myrand(void) {
           next = next * 1103515245 + 12345;
           return((unsigned)(next/65536) % 32768);
       }

       void mysrand(unsigned seed) {
           next = seed;
       }
于 2011-03-09T10:54:41.683 に答える
1

マットが言ったように、乱数ジェネレーターを自分で実装することは常に良い考えです。できればオブジェクト指向で。優れた副作用として、プラットフォーム間の一貫性に加えて、スレッドセーフと場合によっては速度を得ることができます。線形合同法ジェネレーターhttp://en.wikipedia.org/wiki/Linear_congruential_generatorまたはメルセンヌツイスターhttp://en.wikipedia.org/wiki/Mersenne_twisterはあなたを遠ざけるでしょう。

于 2011-03-09T11:01:03.893 に答える
1

Windowsで作業している場合、exeファイルを取得してマシン間を移動すると、srandの実装は実装者固有であるため、srandは同じ番号を生成しますが、常に次のランタイムを使用します。同じ実装者(したがって、Microsoft C ++を使用している場合は、Microsoftのsrandを使用し、MSはおそらく今日または明日srandの実装を変更しません)。Linuxでも同じです。あなたのsrandは常にglibcのものになります。glibcで変更しない限り、番号は同じになります。

于 2011-03-09T11:01:44.063 に答える