在传统的“生日悖论”中,问题是“一群人中的两个或两个以上的人共享生日的机会是多少”。我陷入一个问题,这是对此的扩展。
我不知道两个人分享生日的概率,而是需要扩展问题来知道或更多人分享生日的概率是多少。在您可以通过计算没有两个人分享生日并从减去生日的概率来做到这一点,但是我认为我不能将此逻辑扩展到更大的。
为了使这一点进一步复杂化,我还需要一个适用于(百万)和(千)的非常大数的解决方案。
在传统的“生日悖论”中,问题是“一群人中的两个或两个以上的人共享生日的机会是多少”。我陷入一个问题,这是对此的扩展。
我不知道两个人分享生日的概率,而是需要扩展问题来知道或更多人分享生日的概率是多少。在您可以通过计算没有两个人分享生日并从减去生日的概率来做到这一点,但是我认为我不能将此逻辑扩展到更大的。
为了使这一点进一步复杂化,我还需要一个适用于(百万)和(千)的非常大数的解决方案。
Answers:
这是一个计数的问题:有的可能的分配b到生日ñ人。其中,令q (k ; n ,b )为不超过k个人共享生日但实际上至少k个人共享一个生日的作业数量。我们寻求的概率可以通过将适当的值的q (k ; n ,b )相加并将结果乘以。
对于小于几百的值,可以精确找到这些计数。但是,它们不会遵循任何简单的公式: 我们必须考虑可以分配生日的方式模式。我将说明这一点,而不是提供一般演示。令(这是最小的有趣情况)。可能是:
通常,代码是一个计数的元组,其元素规定正好有个人共享多少个不同的生日。因此,特别是
注意,即使在这种简单的情况下,有两种方式达到最大的生日每两个人:一个与代码,另一个代码{ 2 ,1 }。
我们可以直接计算与任何给定代码对应的可能生日分配的数量。该数字是三个术语的乘积。一个是多项式系数。它计算的分区方法数人进入一个[ 1 ]组1,一[ 2 ]的组2,依此类推。由于组的顺序并不重要,我们必须通过划分这个多项式系数一[ 1 ] !一个[ 2 ] !⋯; 它的倒数是第二项。最后,排列组并为每个组分配一个生日:第一个组有候选者,第二个组有b - 1个,依此类推。这些值必须相乘,形成第三项。它等于“阶乘产物” b (一个[ 1 ] + 一个[ 2 ] + ⋯ )其中b (米)的装置b (b - 1 )⋯ (b - 米+ 1。
顺便提一下,正如Shane所暗示的那样,模拟可以提供有用的检查。使用以下函数创建Mathematica仿真
simulate[n_, b_] := Max[Last[Transpose[Tally[RandomInteger[{0, b - 1}, n]]]]];
Tally[Table[simulate[10000, 1000000], {n, 1, 10000}]] // TableForm
它的输出是
2 8503
3 1493
4 4
这些频率与泊松近似预测的频率非常吻合。
始终可以使用蒙特卡洛解决方案解决此问题,尽管这远非最有效。这是R中的2人问题的简单示例(来自去年的演讲;我将其用作低效率代码的示例),可以轻松调整以解决超过2个问题:
birthday.paradox <- function(n.people, n.trials) {
matches <- 0
for (trial in 1:n.trials) {
birthdays <- cbind(as.matrix(1:365), rep(0, 365))
for (person in 1:n.people) {
day <- sample(1:365, 1, replace = TRUE)
if (birthdays[birthdays[, 1] == day, 2] == 1) {
matches <- matches + 1
break
}
birthdays[birthdays[, 1] == day, 2] <- 1
}
birthdays <- NULL
}
print(paste("Probability of birthday matches = ", matches/n.trials))
}
这是一种通用解决方案。可能有一些错误,请谨慎使用!
首先一些符号:
笔记:
然后,所需的概率由下式给出:
现在,
这是逻辑:您需要正好有个人分享生日的概率。