生日悖论是指如果一个房间里有23人或以上,则至少有两个人生日相同的概率大于50%。编写程序,输出在不同随机样本数量下,23人中至少两个人生日相同的概率。




思路:首先通过random库中的randint()方法确定月份,之后通过判断月份来判定是该月的第几天。比如,4月就只有30天,但1月有31天。然后我们将月份与天数表示为小数形式(10月1日就表示为10.1,3月31日就表示为3.31)。之后将小数存储在列表中,再将列表转换为集合。正是利用了集合会去重这一特点,所以我们对比前后列表的元素个数与集合的元素个数是否相等就可知列表中是否有相同元素。若列表中有相同的元素就让计数变量自加,然后通过计数变量的值除以总次数就可知概率。





# birthday_paradox.py
"""
生日悖论分析。生日悖论是指如果一个房间里有23人或以上,则至少有两个人生日相同的概率大于50%。
编写程序,输出在不同随机样本数量下,23人中至少两个人生日相同的概率。
"""
import random

def randbirthday():
    mon = random.randint(1,12)
    if mon in [4,6,9,11]:
        day = random.randint(1,30)
    elif mon == 2:
        day = random.randint(1,28)
    else:
        day = random.randint(1,31)

    return mon+day/100

def judge(num):
    a = []
    for i in range(num):
        a.append(randbirthday())

    if len(a) !=len(set(a)):  # 条件成立就意味着将列表a转换为集合后,a的元素值少了,也就是说列表a中有重复元素
        return 1
    else:
        return 0

def main():
    num_test = int(input("请输入实验次数:"))
    num_people = int(input("请输入房间中的人数(大于等于23人):"))
    same = 0
    for i in range(num_test):
        if judge(num_people) == 1:
            same += 1

    print("执行{:5d}次,{:2d}人中至少有两人生日相同的概率为{:.4f}%。".format(num_test,num_people,same/num_test*100))

main()
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐