Python 3.3:生日概率

3
尝试在Python中编写生日程序,作为Python的初学者,我有一些困难。
1. 函数duplicates(l)接受列表l并返回True(如果它有重复元素)或False(如果没有)。 2. 函数test(count)生成一个包含1到365之间的count个随机整数的列表。函数duplicates(l)将测试是否存在重复元素。 3. 函数probability(count, num)运行num次count人的测试,并记录具有重复元素的测试数。它返回具有重复项的测试的比例-重复项数除以num。
结果应如下所示:
对于2个人,2个生日的概率为0.002。
对于3个人,2个生日的概率为0.008等等...
卡在步骤2和3上:
import random

# not sure what to put for count
count = [random.randint(1, 365)]

def duplicates(l):
    if len(l)!=len(set(l)):
        return True
    else:
        return False

def test(count):
    return [random.randint(1, 365)]

#def probability(count,num):

我相信我已经正确地完成了第一步,但我不确定接下来该怎么做。


1
第二步的小帮助:def test(count): return [random.randint(1,365) for x in range(count)] - jdotjdot
2个回答

4
你应该像这样创建列表。'test'不是很有用的名称。考虑使用'make_birthday_list'之类的名称代替。
def test(count):
    return [random.randint(1, 365) for x in range(count)]

这个测试已经返回了一个布尔值,所以你只需要这样做。将变量名设为l并不是好的编程规范(看起来太像1),因此我将其更改为the_list

def duplicates(the_list):
    return len(the_list)!=len(set(the_list))

要获得概率,您需要一遍遍地运行测试(蒙特卡罗方法)

例如:

num_samples = 10000
for count in range(100):
    dup = 0
    for test_number in range(num_samples):
        the_list = make_birthday_list(count)
        if duplicates(the_list):
            dup += 1
    print(count, dup/num_samples)   # / returns a float in Python3

非常感谢您的时间。我从您的回答中学到了很多关于Python的知识。 - Ace

1

test 不会返回长度为 count 的列表。结果只有一个元素。您需要使用列表推导式使其正常工作:

[random.randint(1, 365) for x in range(count)]

然后进行第三步:

def probability(count,num):
    dup_trues = sum([duplicates(test(count)) for i in range(num)])  #***
    dup_falses = num-dup_trues
    return float(fails)/num

上述函数中最重要的一行被标记为#***

方括号中的内容是一个列表推导式。

for i in range(num)表示对i=0、i=1、...i=num-1执行此操作。您知道duplicates和test的含义。因此,该列表最终包含了许多true和false(1和0)。

sum将列表的元素相加。这样就给我们了true的数量。

下一行dup_falses = num-dup_trues表示我们总共有num个结果,那些不是true的就是false。

return float(fails)/num在Python 3中不需要使用float


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接