19

rand()関数が与えられたシードに基づいて擬似乱数を生成すること、および特定のプラットフォームでは常に同じシードから同じ数のシーケンスを生成することを理解しています。知りたいのは、異なるシーケンスを与える理由です同じライブラリを使用するプラットフォーム間で? すなわちどのようにrand()実装されていますか?

4

2 に答える 2

21

C++ 標準では、rand() 関数に使用されるアルゴリズムは指定されていません。

機能は、システムの標準ライブラリを作成した人によって定義されます。Microsoft は Visual Studio に含まれる標準ライブラリを担当し、GNU 担当者は GCC にパッケージされた標準ライブラリを担当します。

コンパイラはライブラリをどこから取得するかを選択しているため、同じシステム上の異なるコンパイラに対して異なるバージョンの標準ライブラリが存在する場合があります。要点は変わりません。仕様は、使用可能な機能とその機能を保証します。彼らがそれを行う方法ではありません。

于 2013-02-27T10:22:11.497 に答える
7

rand() 関数は、[0, {RAND_MAX}] の範囲で少なくとも 2^32 の周期を持つ一連の疑似乱数整数を計算します。

rand_r() 関数は、[0, {RAND_MAX}] の範囲の一連の疑似乱数整数を計算します。({RAND_MAX} マクロの値は、少なくとも 32767 でなければなりません。)

シードが指すオブジェクトと同じ初期値で rand_r() が呼び出され、そのオブジェクトが連続するリターンと rand_r() の呼び出しの間で変更されていない場合、同じシーケンスが生成されます。

srand() 関数は、以降の rand() 呼び出しで返される疑似乱数の新しいシーケンスのシードとして引数を使用します。その後、srand() が同じシード値で呼び出された場合、疑似乱数のシーケンスが繰り返されます。srand() の呼び出しが行われる前に rand() が呼び出された場合、シード値 1 で srand() が最初に呼び出されたときと同じシーケンスが生成されます。

rand() 関数は、シーケンス内の次の疑似乱数を返します。

これは、IEEE Std 1003.1 C 標準がrand()関数の動作方法について述べていることです。シーケンスの計算方法については何も述べていません。言い換えれば、各実装者は、疑似ランダムシーケンスジェネレーターの独自のバージョンを自由に選択できます。

あなたの観察は、彼らがその自由を利用したことを示しています。

また、それは多かれ少なかれ C 標準ライブラリのコピーであるrand()の一部であると指摘するかもしれません。新しいライブラリは、十分に新しい C++ コンパイラを持っていて、C++ コンパイラを持っていない場合、より柔軟で標準的なシーケンス ジェネレータを提供します。 <cstdlib>C - C++ の相互運用性に依存します。

于 2013-02-27T10:26:00.060 に答える