python随机生成生日测试生日悖论

生日悖论指如果一个房间里有23人或以上,那么至少有两个人生日相同的概率大于50%。
在闰年的情况下每年有366天,每天的日期都不同,因此可以用1-366数字替代:

x = random.randint(1, 366)

根据自己设定的房间人数将所有随机生成的生日(即数字)添加到同一个列表内:

        y = []
        for i in range(n):
            x = random.randint(1, 366)
            y.append(x)

判断在随机生成的生日内有无重复生日,第一想法是进行比较,逐个对比,但是这样会出现一个bug,当同一个列表内有多个相同元素时,会出现统计次数增加的情况。这时候,一个神奇的函数set()出现了;
经过set()函数的变形之后,如果长度变化了,很明显说明随机生成的生日有重复的日期,随机生成的生日有重复的记为1,

        if len(y)!=len(set(y)):
           print(1)

这样单次实验就OK了,剩下的就是将这个实验重复进行多次,很简单一个for循环搞定,然后再对有重复生日的次数进行统计,根据实验的次数进行概率计算。

最后,附上完整代码:

import random

def fun(n):
    count = 0
    for i in range(100):
        y = []
        for i in range(n):
            x = random.randint(1, 366)
            y.append(x)
        print("{0}...{1}".format(y,len(y)))
        if len(y)!=len(set(y)):
            count+=1
            print(count)
    print(count/100)
n=int(input("请输入房间人数:"))
fun(n)

以及部分结果截图:

请输入房间人数:23
[72, 95, 344, 198, 7, 96, 88, 64, 151, 188, 158, 321, 35, 362, 169, 91, 175, 302, 78, 1, 340, 198, 180]...23
1
[192, 149, 68, 299, 68, 328, 201, 214, 326, 360, 366, 344, 281, 314, 187, 275, 318, 181, 52, 183, 265, 153, 359]...23
2
[121, 191, 284, 31, 17, 102, 341, 83, 224, 141, 145, 53, 284, 102, 351, 78, 266, 225, 167, 39, 316, 73, 277]...23
3
[155, 58, 157, 108, 10, 75, 205, 40, 302, 239, 16, 119, 249, 160, 192, 352, 217, 290, 251, 83, 161, 140, 33]...23
[85, 102, 312, 30, 141, 95, 90, 17, 122, 202, 34, 22, 268, 107, 350, 227, 26, 170, 116, 228, 302, 264, 67]...23
[342, 276, 275, 166, 143, 117, 98, 329, 302, 74, 363, 62, 161, 166, 22, 340, 207, 237, 143, 45, 279, 173, 313]...23
4
...............................
[23, 80, 180, 218, 39, 166, 38, 106, 247, 305, 235, 40, 41, 239, 190, 176, 306, 264, 150, 27, 217, 138, 317]...23
[241, 209, 219, 195, 164, 262, 343, 278, 144, 26, 209, 268, 153, 5, 70, 89, 27, 37, 355, 86, 66, 232, 76]...23
48
[61, 353, 104, 152, 278, 259, 134, 315, 216, 89, 39, 313, 324, 35, 59, 218, 49, 149, 216, 139, 305, 337, 312]...23
49
[238, 182, 104, 6, 94, 4, 31, 201, 326, 266, 257, 46, 342, 164, 43, 249, 143, 105, 52, 76, 108, 280, 313]...23
[192, 4, 200, 212, 95, 325, 164, 5, 309, 360, 5, 245, 150, 328, 20, 329, 235, 96, 226, 336, 148, 211, 307]...23
50
0.5

哈哈,这次试验刚好概率五五开。

  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值