【问题标题】:Pythons random.seed does not work when seeded with a hash使用哈希播种时,Python random.seed 不起作用
【发布时间】:2016-02-03 22:44:14
【问题描述】:

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

import random
import hashlib

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

【问题讨论】:

  • 你如何设置mapSeed?你能展示一些示例输出吗?
  • mapseed 是用户输入字符串的 sha1 哈希
  • 您如何准确地设置mapSeed?请创建一个minimal reproducible example

标签: python python-3.x random


【解决方案1】:

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

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

rnd.seed(mapSeed.digest())

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

【讨论】:

    【解决方案2】:

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

    >>> 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 对象返回的值在某处不会有不同的值,因此您不能依赖它是常量。

    如果希望输出保持不变,种子不能改变。

    【讨论】:

      【解决方案3】:

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

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

      我希望它有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-29
        • 2021-02-11
        • 2017-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多