两个人在充满的房间里有相同生日的概率为 1-p 。在哪里:

p = 365! / 365^n(365 - n)!

显然,这个数字太大了,无法解决这个问题,那么有什么创造性的方法可以解决这个问题呢?

我已经使用模拟以不同的方式解决了这个问题,但是我发现公式可能更优雅。

最佳答案

您可以利用365!/(365-n)! = 365 * 364 * ... *(365-(n-1))

因此,要计算此项(让它成为A = 365!/(365-n)!),您可以简单地将上面的数字如下所示:

unsinged double A=1; // to make sure there is no overflow
for(int i=0;i<n;i++) A*=365-i;

更进一步:p = A/365 ^ n =(364 * 363 * ... *(365-(n-1)))/365 ^(n-1)= 364/365 * 363/365 * ...(365-(n-1))/365。

所以p可以这样计算:
unsigned double p=1;
for(int i=0;i<n;i++) p*= (365-i)/365.0;

在线性时间内

我认为这应该工作:P

关于计算大数的生日概率,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42117846/

10-11 04:52