如何对用在集合上的random.sample()进行doctest?

0 投票
1 回答
639 浏览
提问于 2025-04-17 23:47

我正在为一个函数写测试,这个函数会在一个集合上调用 random.sample()。不幸的是,似乎仅仅设置随机种子并不能保证每次的输出都是一样的。

考虑以下情况:

>>> import random
>>> random.seed(1)
>>> s = set(('Ut', 'Duis', 'Lorem', 'Excepteur'))
>>> for _ in range(5): print(random.sample(s,1))
... 
['Duis']
['Ut']
['Excepteur']
['Ut']
['Lorem']
>>> random.seed(1)
>>> for _ in range(5): print(random.sample(s,1))
... 
['Duis']
['Ut']
['Excepteur']
['Ut']
['Lorem']

但是如果我重新启动Python解释器:

>>> import random
>>> random.seed(1)
>>> s = set(('Ut', 'Duis', 'Lorem', 'Excepteur'))
>>> for _ in range(5): print(random.sample(s,1))
... 
['Duis']
['Lorem']
['Ut']
['Lorem']
['Excepteur']

也就是说,即使用相同的值来设置 random 的种子,也不能保证在不同的Python实例中输出是一样的。我觉得这个问题可能是Python中集合实现的特性。有没有什么好的方法可以为这种情况写测试呢?

提前感谢你的帮助。

1 个回答

2

这个问题发生是因为 random.sample(s, 1) 在内部会调用 list(s),这样就把集合变成了一个列表,而且顺序是随机的。在调用 random.random() 函数之前就已经发生了这个变化。写测试的时候遇到的问题和检查一个集合的测试是一样的:你无法直接检查,所以需要一些变通的方法,比如检查 sorted(s)

在最简单的情况下,你可以通过调用 random.sample(sorted(s), 1) 来解决这个问题。如果代码比较复杂,直接在生产环境中加 sorted() 可能不太合适,那我只能祝你好运了……

撰写回答