Python3 中奇怪的随机种子行为

Vu *_*yen 0 python random debugging set

即使使用 后,输出一数字也不会给出相同的序列random.seed(myseed)。这只发生在 Python3 中,而不是 Python2 中(两者都在 Debian 稳定系统上)。这是一个错误还是我的代码有问题?

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))
Run Code Online (Sandbox Code Playgroud)

下面Python3 在每次运行时给出了不同的序列,但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
Run Code Online (Sandbox Code Playgroud)

GWW*_*GWW 5

你其实是不正确的。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
Run Code Online (Sandbox Code Playgroud)

sets您可以使用以下方式确保您的订单正确无误sorted

print(', '.join(sorted(test)))
Run Code Online (Sandbox Code Playgroud)