如何在一个集合上测试random.sample()



我正试图为一个在集合上调用random.sample()的函数写一个doctest。不幸的是,似乎播种不足以保证输出。

考虑以下内容:

>>> 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中set的实现的。对于如何为这个场景编写doctest有什么想法吗?

提前感谢您的帮助

这是因为random.sample(s, 1)在内部调用list(s),从而以不确定的顺序将集合扁平化为列表。这发生在尝试使用random.random()函数之前。写doctest的问题和写doctest检查集合的问题是一样的:你不能,所以你需要像检查sorted(s)这样的变通方法。

在最简单的情况下,你可以通过调用random.sample(sorted(s), 1)来解决它。如果代码更复杂,并且在生产中添加sorted()没有意义,我只能说祝你好运…

最新更新