为什么random.choice如此不平衡?

时间:2019-04-29 09:25:58

标签: python random

所以我一直在写一些非常随机的实验代码,结果令我感到困惑。

这是我的代码

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"

1 个答案:

答案 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