你为什么要模拟这个问题而不是用封闭的形式来解决这个问题?有一个相当不错的近似值,既快速又容易编写代码:import math

def closed_form_approx_birthday_collision_probability(num_people):

return 1 - math.exp(-num_people * (num_people - 1) / (2 * 365.0))

您还可以实现一个非常好的“精确”解决方案(在引号中,因为在转换为float时会丢失一些保真度):

^{pr2}$

做一个模拟,你可以做这样的事情。我使用列表而不是集合,因为可能性很小,这样可以避免使用集合所做的额外工作: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

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

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐