8

ランダムジェネレーターを使用して初期化されたpyhon2/python3スクリプトが、異なるバージョンやプラットフォーム間で同じシーケンスの疑似ランダム性を生成するという保証はありrandom.setstate()ますrandom.seed()か?(たとえばpython 3.1 on Mac , the same as python 3.2 on Linux 64-bit

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

4

2 に答える 2

7

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

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

互換性を確実に保証する必要がある場合は、ドキュメントで推奨されているように、独自のサブクラスを記述します (または、 simplerandomRandomなどの安定した外部実装を使用します)。random

独自に考案した別の基本ジェネレーターを使用する場合は、クラス Random をサブクラス化することもできます。その場合、random()、seed()、getstate()、setstate()、および jumpahead() メソッドをオーバーライドします。オプションで、新しいジェネレーターは getrandbits() メソッドを提供できます — これにより、randrange() が任意の広い範囲にわたって選択を生成できるようになります。

于 2012-09-16T19:49:38.447 に答える
4

Python プラットフォームに依存しない一貫した実装を持つsimplerandomモジュールを使用できます。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
于 2012-09-16T20:08:16.903 に答える