如何在集合上使用doctest random.sample()?

时间:2014-03-25 09:25:34

标签: python random set doctest random-seed

我正在尝试为一个在集合上调用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的任何想法?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

这是因为random.sample(s, 1)在内部调用了list(s),因此将该集合展平为一个非确定性顺序的列表。在尝试使用random.random()函数之前会发生这种情况。编写doctest的问题与编写doctest来检查集合的问题相同:你不能,所以你需要像检查sorted(s)这样的解决方法。

在最简单的情况下,您可以通过调用random.sample(sorted(s), 1)来解决此问题。如果代码涉及更多,并且在生产中添加sorted()没有意义,我只能说是好运......