1:关于生日悖论 生日悖论
假设有n个人在同一房间内,如果要计算有两个人在同一日出生的机率,在不考虑特殊因素的前提下,例如闰年、双胞胎,假设一年365日出生概率是平均分布的(现实生活中,出生机率不是平均分布的)。
计算机率的方法是,首先找出p(n)表示n个人中,每个人的生日日期都不同的概率。假如n > 365,根据鸽巢原理其概率为0,假设n ≤ 365,则概率为:
因为第二个人不能跟第一个人有相同的生日(概率是364/365),第三个人不能跟前两个人生日相同(概率为363/365),依此类推。用阶乘可以写成如下形式:
p(n)表示n个人中至少2人生日相同的概率:
n≤365,根据鸽巢原理, n大于365时概率为1。
当n=23发生的概率大约是0.507。其他数字的概率用上面的算法可以近似的得出来:
n | p(n) |
---|---|
10 | 12% |
20 | 41% |
30 | 70% |
50 | 97% |
100 | 99.99996% |
200 | 99.9999999999999999999999999998% |
300 | 1 − (7 × 10−73) |
350 | 1 − (3 × 10−131) |
≥366 | 100% |
注意所有人都是随机选出的:作为对比,q(n)表示房间中 n个其他人中与特定人(比如你)有相同生日的概率:
当n = 22时概率只有大约0.059,约高于十七分之一。如果n个人中有50%概率存在某人跟你有相同生日, n至少要达到253 。注意这个数字大大高于.究其原因是因为房间内可能有些人生日相同。==数学论证(非数字方法)==
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
int t,k=1;
scanf("%d",&t);
while(t--)
{
int n,num=0;
scanf("%d",&n);
double p=1.0;// p不能等于 1
for(int i=0;;i++)
{
p=p*(1-(double)i/n);
num++;
if(1.0-p>=0.5)
break;
}
// while(p>0.5)
// {
// p=(n-1)/n*p;
// n--;
// num++;
// }
printf("Case %d: %d\n",k++,num-1);//邀请人数 总人数减 1
}
} /*for(int i=0;;i++)
{
p=p*(1-double(i/n));
num++;
if(1-p>=0.5)
break;
}*/