24

random.random()別のpython3バージョンがインストールされた別のシステムで、pythonからランダムなシーケンスを再現しようとしています。

ドキュメントにあるように、これは簡単なはずです:

random モジュールのアルゴリズムとシード関数のほとんどは、Python のバージョン間で変更される可能性がありますが、次の 2 つの側面は変更されないことが保証されています。

  • 新しいシード方法が追加された場合、下位互換性のあるシーダーが提供されます。
  • 互換性のあるシーダーに同じシードが与えられると、ジェネレーターの random() メソッドは同じシーケンスを生成し続けます。

したがって、次のコードは、特定の python3 バージョンに関係なく、常に同じ 10 個の数字を出力することを期待しています。

import sys
print(sys.version)

from random import seed, random

seed(str(1))
for i in range(10):
    print(random())

ただし、2 つの異なるマシンでテストします。

3.2.3 (default, May  3 2012, 15:51:42) 
[GCC 4.6.3]
0.4782479962566343
0.044242767098090496
0.11703586901195051
0.8566892547933538
0.2926790185279551
0.0067328440779825804
0.0013279506360178717
0.22167546902173108
0.9864945747444945
0.5157002525757287

3.1.2 (release31-maint, Dec  9 2011, 20:59:40)  
[GCC 4.4.5]
0.0698436845523
0.27772471476
0.833036057868
0.35569897036
0.36366158783
0.722487971761
0.963133581734
0.263723867191
0.451002768569
0.0998765577881

異なる結果を与えます。

どうしてこれなの?そして、これを機能させる方法はありますか (つまり、同じランダムシーケンスを 2 回取得しますか?)

4

2 に答える 2

20

Python 3.2の新機能(この質問のため)を調べていたところ、次のことがわかりました。

random.seed()関数とメソッドは、sha512ハッシュ関数を使用して文字列シードをソルトするようになりましたPython 3.1シーケンスを再現するために以前のバージョンのシードにアクセスするには、バージョン引数を1、random.seed(s、version = 1)に設定します。

これは、下位互換性オプションを備えた重大な変更(3.1から3.2)のようです。

(恐ろしい指摘として、互換性のあるシーダー提供されているため、ドキュメント契約に違反していません。)

于 2012-08-13T07:21:31.790 に答える
6

ドキュメントにseedは、ハッシュ関数を使用して文字列を有効な入力シードに変換すると書かれています。Python2.X のさまざまなバージョンをテストしたとき (現時点では 3 つがインストールされていません)、一部のバージョンでは異なる値hash(str(1))hash返されました。代わりに int を渡したい場合があります (シードの後方互換バージョンの使用に関する @pst のポイントに加えて)。

3.2のrandomモジュール ドキュメントからのスニペット:

x が int の場合、直接使用されます。

バージョン 2 (デフォルト) では、str、bytes、または bytearray オブジェクトが int に変換され、そのすべてのビットが使用されます。バージョン 1 では、代わりに x の hash() が使用されます。

(x はシードの初期化子です)

于 2012-08-13T07:26:30.383 に答える