2013-02-27 10 views
19

rand()関数は与えられたシードに基づいて擬似乱数を生成し、与えられたプラットフォームでは常に同じシードから同じ数のシーケンスを生成することを理解しています。同じライブラリを使用するプラットフォーム間で異なるシーケンス?私。 rand()はどのように実装されていますか?C++ stdlib rand()関数は、プラットフォーム間で同じシードに対して異なる値を与えるのはなぜですか?

+8

'rand'の指定はシーケンスによって生成される値を指定しないので、 [](http://en.cppreference。com/w/cpp/numeric/random)を入力してください。 –

+3

標準ではシーケンス、または擬似乱数シーケンスの生成方法は指定されていません。したがって、これらの2つの側面に関するプラットフォーム間での実装や動作に関する制限はありません。 C++ 11では、[仕様のより高い乱数発生器](http://en.cppreference.com/w/cpp/numeric/random)が追加されています。 – juanchopanza

+0

私は標準をチェックして、シーケンスに関して何も指定されていないことに気づいたので、実装がどのような要因に依存しているのでしょうか?それはOSに任されていますか? – Einherji

答えて

21

C++標準では、rand()関数にどのアルゴリズムを使用するか指定していません。

あなたのシステムに標準ライブラリを書いた人は、Visual Studioに含まれている標準ライブラリ用のMicrosoftと、GCCにパッケージされている標準ライブラリ用のGNUの人たちによって機能が定義されています。

コンパイラはライブラリをどこから取得するかを選択しているため、同じシステム上の異なるコンパイラ用の異なるバージョンの標準ライブラリを使用することができます。ポイントは同じままです:仕様は、どの機能が利用可能で、何をしているかを保証します。彼らはそれをどうやって行うのではない。

+0

これは、WindowsでGNUコンパイラを実行すると、同じシーケンスになりますか? –

+0

@OmarKooheji私は実際にWindowsにGCCをインストールしようとしたことはありません。私はGCCがインストールされると、標準ライブラリ(おそらくあらかじめコンパイル済み)の独自のコピーが付属していると思います。 確かにわかっていますが、Windows PCにアクセスできる人は、私が実際に自分の答えを更新してもらえますか? – KidneyChris

+1

@OmarKooheji私は興味があったので調査しました。私の答えが少し正確になるように更新しました(これは、将来、コメントスレッドに従おうとしている人々の利益のためです)。 – KidneyChris

7

のrand()関数は、少なくとも2^32の周期範囲[0、{RAND_MAX}]で擬似ランダム整数 のシーケンスを計算しなければなりません。

rand_r()関数は[0、{RAND_MAX}]の範囲の擬似ランダムシーケンス を計算しなければなりません。 rand_r()が シードによって指さオブジェクトの同じ初期値で呼び出され、そのオブジェクトが連続 戻り間で変更されていない場合

({RAND_MAX} マクロの値は少なくとも32767でなければなりません) rand_r()を呼び出すと、同じシーケンスが生成されます。

srand()関数は、引き続きrand()を呼び出すことによって返される 疑似乱数の新しいシーケンスのシードとして引数を使用します。同じシード値で srand()が呼び出された場合は、 の擬似乱数のシーケンスが繰り返されます。ランド()は()作られSRANDする 任意の呼び出しの前に呼び出された場合にsrand()は最初の1

のシード値ランドと呼ばれたときに、同じシーケンスが ように生成されなければならない()関数が返します シーケンス内の次の疑似乱数。

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

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

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

+0

'rand'もC++の一部です標準のいくつかの部分がC標準の観点から定義されていますが、 –

+0

@phresnel、それはC++の一部ではないので、それは出て来ました。私は自分の答えを編集して、私の意図を反映しています。 – daramarak