一次聚会需要邀请多少人,才能让其中3人的生日很可能相同?

为了便于叙述,对题目作一个转化:

考虑将n粒豆子随机放入365个桶中,至少有一个桶内豆子数量不少于3的概率,其中豆子、桶均有区别

因为豆子和桶均有区别,可得全事件的数量为365^n

豆子放入完成后,桶内至多有一粒豆子的情况相当于从365个桶中选取n个,并将n粒不同豆子依次放入,因此事件数为:

仅有一个桶内有两粒豆子,其余均为一粒或没有。这里我们首先考虑从n粒豆子中选出两粒绑定在一起,进而转化为从365个桶中选取n-1个,将豆子依次放入,事件数为:

有且仅有i个桶内有两粒豆子,其余均为一粒或没有。这里有一点需要注意的是绑定豆子的顺序问题,即先绑定豆子[1, 2],后绑定豆子[3, 4]与先绑定[3, 4]后绑定[1, 2]是相同的,因此在绑定后需除以排列数。事件数为:

从全事件中去除上述事件后,剩余事件占全事件的比例即为至少一桶内有不少于3粒豆子的概率,实现如下:

from math import factorial
import numpy as npclass Birthday:def C(self, a, b):return factorial(a) / factorial(a - b) / factorial(b)def A(self, a, b):return factorial(a) / factorial(a - b)def slove(self, n):if n < 3:return 0elif n > 730:return 1elif n < 366:pair = int(n / 2)p = (self.C(365, n) * self.A(n, n) + sum(self.C(365, n - i) * np.prod([self.C(n - 2 * k, 2) for k in range(i)]) / self.A(i, i) * self.A(n -i, n- i) for i in range(1, pair + 1))) / 365**nreturn 1 - pelse:# 估计用不上,计算量太大pair = int(n / 2)return 1 - sum(self.C(365, n - i) * np.prod([self.C(n - 2 * k, 2) for k in range(i)]) / self.A(i, i) * self.A(n -i, n- i) for i in range(1, pair + 1)) / 365**nif __name__ == '__main__':bir = Birthday()bir.slove(30)   # 0.0285bir.slove(50)   # 0.1264bir.slove(80)   # 0.4182bir.slove(87)   # 0.4995bir.slove(88)   # 0.5111bir.slove(120)  # 0.8280

可以看出,88人时,有三人生日相同的概率即超过0.5

此处答案与使用期望计算略有不同,个人认为是因为期望计算时包含了部分重复导致

算法导论 练习5.4-4相关推荐

  1. 算法导论Java实现-构建MaxHeap

    package lhz.algorithm.chapter.six; /** * "构建堆",<算法导论>6.3章节 Building a heap * 利用之前实现的 ...

  2. 算法导论读书笔记-第十九章-斐波那契堆

    算法导论第19章--斐波那契堆 可合并(最小)堆(mergeable min-heap) : 支持以下5种操作的一种数据结构, 其中每一个元素都有一个关键字: MAKE-HEAP(): 创建和返回一个 ...

  3. 《算法导论》读书笔记--第三章 函数的增长

    好长时间了,继续算法导论. 当输入规模足够大时,并不计算精确的运行时间,倍增常量和低阶项被舍去.我们要研究的是算法的渐近效率,即在输入规模无限量时,在极限中,算法的运行时间如何随着输入规模的变大而增加 ...

  4. 《算法导论》中parallel for 的时间复杂度

    最近在看<算法导论>,看到多线程算法这章中,有一个parallel for循环的例子,如下: parallel for i = 1 to n        parallel for j = ...

  5. 算法导论中求解时间复杂度的三种方法

    这一章讲的是递归式(recurrence),递归式是一组等式或不等式,它所描述的函数是用在更小的输入下该函数的值来定义的. 本章讲了三种方法来解递归式,分别是代换法,递归树方法,主方法. 1.代换法( ...

  6. 算法导论Java实现-随机化数组的两种方式(5.3章节)

    package lhz.algorithm.chapter.five; /** * 随机数组两种实现,<算法导论>第五章第三节 * 本文地址:http://mushiqianmeng.bl ...

  7. 《算法导论》读书笔记(七)

    <算法导论>读书笔记之第16章 贪心算法-活动选择问题 前言:贪心算法也是用来解决最优化问题,将一个问题分成子问题,在现在子问题最优解的时,选择当前看起来是最优的解,期望通过所做的局部最优 ...

  8. 算法导论chapter6 堆排序的代码

    按照<算法导论>上的伪代码实现了,刚开始没注意index的问题,导致错误,看来对于伪代码实现C还是要注意下啊!! #include<iostream> #include < ...

  9. Python语言程序设计之urllib.request抓取页面,网易公开课之《麻省理工学院公开课:算法导论》

    Python语言用urllib.request模块抓取页面非常简单,再将抓取的页面内容用re模块解析,找出自己想要的东西.下面就就此方法来抓取网易公开课之<麻省理工学院公开课:算法导论>, ...

  10. 算法导论中C语言代码,算法导论-学习笔记与进度

    算法导论 阅读进度 第一部分 基础知识 第一章 计算中算法的角色 Done 1.1 算法 输入与输出 算法可以解决哪些问题 数据结构 技术 一些比较难的问题 1.2 作为一种技术的算法 效率 算法和其 ...

最新文章

  1. 《Go并发编程实战》第2版 紧跟Go的1.8版本
  2. java 基于tcp客户端服务端发送接收数据
  3. 《剑指offer》c++版本 3.数组中重复的数字
  4. java中try 与catch的使用
  5. php基础知识总结大全,php基础知识回顾 —— 常量
  6. encoding python3_关于 Python3 的编码
  7. Spring IOC学习心得之BeanPostProcessor,BeanNameAware,BeanClassLoaderAware,BeanFactoryAware接口是如何起作用的
  8. android studio无app项,Android studio 3.0:无法解析依赖:app @ dexOptions
  9. Spring定时器技术终结者——采用Scheduled注释的方式实现Spring定时器
  10. android实体键盘输入法,推荐一个实体键盘专用输入法,是对 autotext的改进
  11. session过期时间
  12. Java垃圾回收(GC)机制
  13. 【弃】Selenium官方文档中文版
  14. Linux 2.6内核配置说明
  15. 微信公众号 菜单 { “errcode“: 47001, “errmsg“: “data format error rid: 61b36b ...“}
  16. 微信公众号怎么放html文件,微信公众号html缓存处理
  17. Matlab中的plotyy用法总结
  18. 在北京工作5年的程序员,通过人才引进入职县城事业编,月薪曝光
  19. jdk安装https证书
  20. arduino笔记20:红外遥控

热门文章

  1. 超强正能量。不得不推荐的新歌 黑暗骑士(JJ、五月天)。
  2. uniapp 自定义图片水印插件(任意位置) Ba-Watermark
  3. ChatGPT的使用学习笔记
  4. 高阶常微分方程的数值解法(runge-kutta的高阶形式)
  5. Android开发模式:模型—视图—主导器模式
  6. EXCEPT、INTERSECT和UNION
  7. 申请Google Map服务
  8. linux c socket编程学习(1)(一些基本概念及基本的函数使用)
  9. pxelinux_IT怪胎:如何使用PXElinux v5和Wimboot网络引导(PXE)WinPE恢复磁盘
  10. SQL注入进阶:掌握布尔盲注和延时注入攻击技巧