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