3

试图在 python 中做生日程序。作为 Python 的初学者,我遇到了一些麻烦。

  1. 函数duplicates(l)接受一个列表 l,如果它有一个重复的元素,则返回 True,如果没有,则返回 False。
  2. 函数test(count)生成1 到 365 之间的count随机整数列表。函数 duplicates(l) 将测试重复项。
  3. 函数probability(count, num)运行count人的num次测试,并计算重复的测试次数。它返回带有重复的测试的分数 - 重复的数量除以 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):

我相信我的第一步是正确的,但我不知道从这里去哪里。

4

2 回答 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
于 2012-11-27T05:58:10.957 回答
1

test不返回长度列表count。结果只有一个元素。你会想利用列表理解来让它工作得很好:

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

然后对于第 3 步:

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 做这些事情。您知道重复和测试的作用。所以列表以一堆真假(一和零)结束

sum将列表的元素相加。所以这给了我们真实的数量

下一行dup_falses = num-dup_trues说我们总共有 num 个结果,那些不正确的结果是错误的。

return float(fails)/numfloatpython 3 中不需要

于 2012-11-27T06:04:57.637 回答