所以我一直在写一些非常随机的实验代码,结果令我感到困惑。
这是我的代码
from random import choice
class A:
def __init__(self, l):
parsed = iter(l)
self.include = next(parsed) == "+"
self.l = list(parsed)
def get(self, l):
rt = self.l
if self.include:
rt += l
return choice(rt)
a = A("+abcd")
d = dict()
for key in "abcdef":
d[key] = 0
for i in range(100000):
d[a.get(["e", "f"])] += 1
print(d)
我希望代码能输出随机但有些均匀的选择分布。像这样:
{'a': 16678, 'b': 16539, 'c': 16759, 'd': 16584, 'e': 16631, 'f': 16809}
但是实际输出是这样:
{'a': 3, 'b': 4, 'c': 7, 'd': 3, 'e': 49588, 'f': 50395}
我的意思是,这是随机的,但是如果那是真实的话,那么到现在我可能还已经赢得了10次彩票。
那么,这到底是怎么回事?为什么random.choice
函数比其他函数更偏爱选择"e"
和"f"
?
答案 0 :(得分:7)
random.choice
很好。您只是没有从自己认为的选项中进行选择。在get
中:
rt = self.l
if self.include:
rt += l
您没有复制self.l
。每个rt += l
都附加到同一个列表对象,因此列表最终以一个庞大的'e'
和'f'
s出现,并且大多数时候都会被选中。
为避免这种情况,您可以预先复制self.l
:
rt = self.l[:]
if self.include:
rt += l
或者您可以使用+
代替+=
,因为+
会建立一个新列表而不是改变左侧:
rt = self.l
if self.include:
rt = rt + l