Python 巨蟒生日

Python 巨蟒生日,python,function,set,Python,Function,Set,所以我试图制作一个程序,创造一个房间里一群人有相同生日的可能性。。。我不知道如何创建这个函数。这是我到目前为止所拥有的 def birthday(): mySet = set() x = 1 for item in mySet: if item in mySet: return x else: mySet().append() # don't know what to do here. 编辑

所以我试图制作一个程序,创造一个房间里一群人有相同生日的可能性。。。我不知道如何创建这个函数。这是我到目前为止所拥有的

def birthday():
    mySet = set()
    x = 1
    for item in mySet:
        if item in mySet:
            return x
        else:
            mySet().append() # don't know what to do here.
编辑:

好的,我想做的是用一个集合来做一个函数,这个集合用数字1到365来存储生日…例如,如果你随机选择一个房间,里面有30个人,他们的生日可能不一样。虽然,如果你有双胞胎在同一个房间,你只需要两个人
在房间里过同样的生日。所以最终我需要一个参数来测试这个函数几次,并将其平均。不幸的是,我不知道该怎么做。我想让x作为房间里有多少人的计数器,当有匹配时,循环停止,循环停止。我也不知道要附加什么。

你为什么要尝试模拟这个问题,而不是使用这个问题的封闭式解决方案?有一个相当不错的近似值,它快速且易于编码:

import math
def closed_form_approx_birthday_collision_probability(num_people):
    return 1 - math.exp(-num_people * (num_people - 1) / (2 * 365.0))
您还可以实现一个非常好的“精确”解决方案(在引号中,因为转换为float时会丢失一些保真度):

要进行模拟,您可以这样做。我使用列表而不是集合,因为可能性的数量很小,这避免了使用集合所做的额外工作:

import random
def birthday_collision_simulate_once(num_people):
    s = [False] * 365
    for _ in range(num_people):
        birthday = random.randint(0, 364)
        if s[birthday]:
            return True
        else:
            s[birthday] = True
    return False

def birthday_collision_simulation(num_people, runs):
    collisions = 0
    for _ in range(runs):
        if birthday_collision_simulate_once(num_people):
            collisions += 1
    return collisions / float(runs)
我从模拟和封闭形式的解决方案中得到的数字看起来与


当然,有这么多次运行的模拟更接近实际的41.1%,计算起来要慢得多。我会选择一个封闭形式的解决方案,这取决于它的准确度。

你是通过尝试所有组合来计算概率的,直到你找到你已经得到的东西-是这样吗?首先你需要澄清你想做得更好。其次,每个项目都在mySet中,这就是设置for循环的方式。匹配什么??你的片子里什么都没有。试着先做你想做的事情。那密码毫无意义对不起是的Jon没错
import random
def birthday_collision_simulate_once(num_people):
    s = [False] * 365
    for _ in range(num_people):
        birthday = random.randint(0, 364)
        if s[birthday]:
            return True
        else:
            s[birthday] = True
    return False

def birthday_collision_simulation(num_people, runs):
    collisions = 0
    for _ in range(runs):
        if birthday_collision_simulate_once(num_people):
            collisions += 1
    return collisions / float(runs)
>>> closed_form_approx_birthday_collision_probability(20)
0.40580512747932584
>>> closed_form_exact_birthday_collision_probability(20)
0.41143838358058
>>> birthday_collision_simulation(20, 100000)
0.41108