0

背景:很多人都熟悉所谓的生日“悖论”,即在一个 23 人的房间里,两个人同一天生日的概率超过 50/50。对于 n 个人来说,更一般的形式是,没有两个人生日相同的概率是 p(n) = 365!/ (365^n *(365-n)!)。类似的计算用于理解散列空间大小、密码攻击等。

动机:提出以下问题的原因实际上与了解特定的金融市场行为有关。然而,“生日悖论”问题的一个变体完全适合类比,并且可能会引起不同背景的人更广泛的兴趣。因此,我的问题是用这些更熟悉的术语来表述的,如下所示。

问:一个房间一共有60个人。其中,事实证明有 11 (11) PAIRS 人的生日相同,还有一个 TRIPLE(即 3 人一组)生日相同。剩下的 60 - 2*11 - 3 = 35 人的生日不同。假设一个人口中任何一天都有相同的生日概率(即忽略 2 月 29 日和可能的季节性影响),并且给定指定的生日分布,随机选择这 60 个人的概率是多少?

4

1 回答 1

0

如果我的计算是正确的,那么 60 人一组有一个 Triple 和 11 Pairs 的几率是

       365*1*1          364*1          363*1                354*1    1    353   352         319
60c3 * ------- * 57c2 * ----- * 55c2 * ----- * ... * 37c2 * ----- * --- * --- * --- * ... * ---
        365^3           365^2          365^2                365^2   11!   365   365         365

结果是 0.0036%。

请注意,这60c3意味着“60 选择 3”,与 相同60! / (57! * 3!)。另请注意,1/11!软糖因素是由于您有 11 对可以按任何顺序重新排列的事实。我用来计算百分比的代码如下所示。你应该检查它,以及上面的公式的准确性。使用风险自负。没有任何明示或暗示的保证。

double result, people, daysleft;

// start with the triplets: 60c3 * 365 / 365^3
result = (60.0 * 59.0 * 58.0) / (6.0 * 365.0 * 365.0);

// now consider the pairs:  Nc2 * daysleft / 365^2
people = 57.0;
daysleft = 364.0;
for ( i = 0; i < 11; i++ )
{
    result *= (people * (people - 1.0) * daysleft) / (2.0 * 365.0 * 365.0);
    people -= 2.0;
    daysleft -= 1.0;
}

// there are 11 factorial ways to rearrange the pairs
for ( i = 11; i > 0; i-- )
    result /= (double)i;

// finish up with the unique birthdays
for ( i = 0; i < 35; i++ )
{
    result *= daysleft / 365.0;
    daysleft -= 1.0;
}

printf( "%lf%%\n", result * 100.0 );
于 2014-07-24T21:10:38.200 回答