如何编写在每次运行中都给出相同输出的 Python 程序?

fue*_*zig 2 python random set random-seed

我有以下代码

import random

random.seed(42)

mylist = set(["A", "B", "C", "D", "E", "F", "G", "H"]) 
tn = random.sample(mylist, 4)
print(tn)
Run Code Online (Sandbox Code Playgroud)

到目前为止,我希望这总是打印相同的结果。但是,在每次连续运行时,它都会返回不同的 4 个字母序列。后来我发现它在删除时是稳定的set(在这个最小的例子中,除了触发问题之外没有其他用途)。

为什么有人会set以不确定的方式实施?我可以想象它的实现可能需要(伪)随机数,但即便如此,我还是希望我的程序仍然是确定性的,即使使用set. 我还注意到这是依赖于版本的:

Python版本:

  • 2.7.12:稳定
  • 3.5.2:不同的输出
  • 3.6.12:不同的输出

如何使用set并仍然获得可重现的输出?在采样之前使用排序mylistsorted有效的,但是您必须对在(天真的)空操作之后再次排序的列表进行排序是非常不直观的。

Pru*_*une 5

您的期望是直观的,但它不是语言规范的一部分。

哈希机制 set未指定;Python 实现不需要重现哈希映射——或使用任何机制。它可能取决于最近的存储使用情况、可用位置、系统时间或月相。

如果您对“作品”的个人定义需要可重现的映射,那么您有责任提供自己的映射,或使用支持这种稳定性的语言工具。排序并没有给你设定的稳定性; 它用排序列表替换集合。