我正在尝试为一个在集合上调用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的任何想法?
提前感谢您的帮助。
答案 0 :(得分:1)
这是因为random.sample(s, 1)
在内部调用了list(s)
,因此将该集合展平为一个非确定性顺序的列表。在尝试使用random.random()
函数之前会发生这种情况。编写doctest的问题与编写doctest来检查集合的问题相同:你不能,所以你需要像检查sorted(s)
这样的解决方法。
在最简单的情况下,您可以通过调用random.sample(sorted(s), 1)
来解决此问题。如果代码涉及更多,并且在生产中添加sorted()
没有意义,我只能说是好运......