2016-06-25 5 views
0

の数値のセットを出力すると、random.seed(myseed)を使用しても同じシーケンスが得られません。これは、Python3ではなく、Python2(どちらもDebian安定システム上)で発生します。それは私のコードでバグか何か間違っていますか? python3以下Python3での異常なランダムシードの振る舞い

import random 
seed=20.0 
random.seed(seed) 
print("seed: {}".format(seed)) 
test = [str(random.randint(0,1000)) for _ in range(10)] 
print(', '.join(test)) 
ss = set(test) 
print(', '.join(ss)) 

各実行で異なる配列を与えるが、Python2は(予想通り)すべてのラン間で類似の配列を提供します。

$ python3 --version 
Python 3.4.2 
$ python2 --version 
Python 2.7.9 

#same sequences 
$ python2 randtest.py 
seed: 20.0 
906, 686, 767, 905, 260, 636, 905, 873, 573, 169 
906, 636, 905, 573, 767, 873, 260, 169, 686 

$ python2 randtest.py 
seed: 20.0 
906, 686, 767, 905, 260, 636, 905, 873, 573, 169 
906, 636, 905, 573, 767, 873, 260, 169, 686 

$ python2 randtest.py 
seed: 20.0 
906, 686, 767, 905, 260, 636, 905, 873, 573, 169 
906, 636, 905, 573, 767, 873, 260, 169, 686 

#diff sequences 
$ python3 randtest.py 
seed: 20.0 
927, 740, 702, 805, 784, 901, 926, 154, 266, 690 
926, 690, 784, 702, 740, 927, 266, 154, 901, 805 

$ python3 randtest.py 
seed: 20.0 
927, 740, 702, 805, 784, 901, 926, 154, 266, 690 
702, 926, 784, 901, 154, 266, 805, 690, 740, 927 

$ python3 randtest.py 
seed: 20.0 
927, 740, 702, 805, 784, 901, 926, 154, 266, 690 
805, 926, 901, 784, 740, 927, 154, 690, 266, 702 

答えて

3

実際には間違っています。 Python 3は同じ数の数値を返しています。 set Pythonを実行するたびに順序のないコンテナが同じ順序になるという前提があります。

たとえば、最後の二つのpython3のテストのために:

>>> a = set([702, 926, 784, 901, 154, 266, 805, 690, 740, 927]) 
>>> b = set([805, 926, 901, 784, 740, 927, 154, 690, 266, 702]) 
>>> a == b 
True 

あなたのsetsが正しく、私はセットが順不同コンテナであることを知っているsorted

print(', '.join(sorted(test))) 
+0

を使用して注文されていることを確認することができますが。しかし、ランダムシードを設定して、そのセットがシードに応じていくつかランダムであるが特定の順序になるように繰り返すと、私は期待しています。私の例では、これはPython2では表示されますが、Python3では表示されません。 –

+0

セットの順序はランダムなシードに依存しないため、前提が正しくない。多分あなたの例のためのpython2の場合ですが、それはそれが常に真実であることを暗示していませんし、python3の場合も暗示しません。 – GWW

+0

理由をより詳しく説明するコメントがあります(http://stackoverflow.com/questions/3848091/python-set-iteration-order-varies-from-run-to-run)。基本的には、メモリ内の場所に依存するオブジェクト 'id()'がハッシュ関数で使用される場合があります。 – GWW