2012-09-16 15 views
7

random.setstate()またはrandom.seed()で初期化されたランダムジェネレータを使用したpyhon2/python3スクリプトでは、異なるバージョンとプラットフォーム間で同じ擬似乱数系列が生成されることはありますか? (例えば、python 3.1 on Mac , the same as python 3.2 on Linux 64-bitpython random.setstate()、seed() - 実装全体で同じ結果が保証されていますか?

質問は、python2とpython3の両方についてです.pthon3スクリプトはpython3インタプリタで実行され、逆も同様です。

+0

http://docs.python.org/dev/ library/random.html#random.seed –

+0

python3.xとpython3.yの場合x!= yとなると同じ結果が出る –

+1

ドキュメントに、結果がPythonバージョン間で同じであることが保証されていないそれはAPIの一部ではなく、それに依存するのは正しくありません。または、少なくとも、これは私の考えです。たとえアルゴリズムが言及されているという事実があなたの質問をするかもしれません。 – Bakuriu

答えて

6

Python 2.3以降では、システムランダム関数(PythonのC拡張モジュールとして実装されている)とは独立したMersenne Twisterジェネレータを使用します。 Mersenne Twisterを使用しているすべてのバージョンでは、結果はバージョンとプラットフォームによって異なるはずです。

以前は、WichmannHillジェネレータを使用して下位互換性を保証できましたが、残念ながらPython 3.xでは削除されているようです。

あなたは絶対に、互換性を保証する独自のRandomサブクラスを記述する必要がある場合(または安定した外部の実装を使用し、例えばsimplerandomrandomドキュメントで推奨されているよう:あなたがしたい場合はRandomクラスもサブクラス化することができ

その場合、random()、seed()、getstate()、setstate()およびjumpahead()メソッドをオーバーライドします。オプションで、新しいジェネレータがgetrandbits()メソッドを提供することができます。これにより、randrange()は任意の大きな範囲で選択を生成できます。

4

simplerandomモジュールを使用できます。このモジュールは、Pythonプラットフォームとは独立した一貫した実装を備えています。 Python 2.4,2.5,2.6,2.7,3.1,3.2をサポートしています。それは9種類のアルゴリズムを持っています。

ここでは例です:

>>> import simplerandom.iterators as sri 
>>> rng = sri.MWC1(12345) 
>>> next(rng) 
498186671L 
>>> next(rng) 
888940288L 
>>> next(rng) 
345072384L 

そして限り、あなたは同じ値でシードとして、あなたは同じ結果を得る:

>>> rng = sri.MWC1(12345) 
>>> next(rng) 
498186671L 
>>> rng = sri.MWC1(98765) 
>>> next(rng) 
3546724783L