当使用哈希种子时,Pythons random.seed不起作用

时间:2016-02-03 22:44:14

标签: python python-3.x random

我正在尝试随机播种蟒蛇的一个实例。但是,当我运行下面的代码时,即使用户输入保持不变,每次都会生成不同的答案。

import random
import hashlib

mapSeed = hashlib.sha1(input("Enter seed: ").encode('utf-8'))
rnd = random.Random()
rnd.seed(mapSeed)
print(mapSeed)
print(rnd.random())

3 个答案:

答案 0 :(得分:1)

mapSeed,如行print(mapSeed)所示,不是字符串,而是SHA1 HASH对象。当您将其传递给random.seed时,它可能会使用对象的(随机)hash(),因此会产生不同的结果。

您需要先从哈希对象中提取摘要,然后再将其传递给random.seed

rnd.seed(mapSeed.digest())

(你也可以直接使用用户输入;首先对它进行SHA1哈希没有任何好处)

答案 1 :(得分:0)

假设种子在所有执行期间保持不变,它将永远不会改变。看看这个:

>>> import random
>>> r = random.Random()
>>> r.seed(515)
>>> r.random()
0.1646746342919
>>> r.random()
0.9567223584846931
>>> r.seed(515)
>>> r.random()
0.1646746342919
>>> r.random()
0.9567223584846931

但是,由于您是从用户输入的字符串开发种子,因此该值不会保持不变。由于Random对象返回的值在某处不会有不同的值,因此您不能依赖它来保持不变。

如果您希望输出保持不变,种子无法更改。

答案 2 :(得分:-1)

关于"随机数"的一个非常重要的概念。它实际上并不是随机的,它们依赖于: 1)用于生成"随机"数字序列 2)算法的种子

相同的种子将生成相同的随机数序列。为什么?因为如果您可以使用相同的随机数流,您可以使用相同的随机数流来测试代码中的更改,并检查代码的最终输出是否是由代码中的更改而不是出现不同的随机数数字。这在模拟过程(队列,交通模拟等)中非常常见。 因此,相同的种子=相同的随机数流。 将种子更改为具有不同的随机数流,

我希望它有所帮助。

相关问题