이것은 계산 문제 : 거기에 의 가능한 할당 ㄴ 에 생일 n 개의 사람들이. 그 중 q ( k ; n , b ) 는 k 명 이상이 생일을 공유하지 않지만 실제로는 k 명이 공유하는 생일이 하나 이상인 과제의 수로 지정하십시오 . 우리가 찾는 확률 은 적절한 k 값에 대해 q ( k ; n , b ) 를 더하고 결과에 b - n을 곱하여 구할 수 있습니다 .bnbnq(k;n,b)kkq(k;n,b)kb−n
이 계수는 수백 미만 의 값에 대해 정확하게 찾을 수 있습니다 . 그러나 그들은 어떤 간단한 공식도 따르지 않을 것입니다 : 우리는 생일을 할당 할 수있는 방법의 패턴을 고려해야합니다 . 나는 일반적인 데모를 제공하는 대신 이것을 설명 할 것이다. n = 4라고 하자 (이것은 가장 흥미로운 흥미로운 상황이다) 가능성은 다음과 같습니다.nn=4
- 각 사람마다 독특한 생일이 있습니다. 코드는 {4}입니다.
- 정확히 두 사람이 생일을 공유합니다. 코드는 {2,1}입니다.
- 두 사람은 생일이 하나 있고 다른 두 사람은 다른 생일이 있습니다. 코드는 {0,2}입니다.
- 세 사람이 생일을 공유합니다. 코드는 {1,0,1}입니다.
- 4 명이 생일을 공유합니다. 코드는 {0,0,0,1}입니다.
일반적으로 코드 는 k 번째 요소가 정확히 k 명의 사람들 이 공유하는 별개의 생년월일을 규정하는 수의 튜플입니다 . 따라서 특히{a[1],a[2],…}kthk
1a[1]+2a[2]+...+ka[k]+…=n.
이 간단한 경우에도 생일 당 최대 두 사람이 달성 할 수있는 두 가지 방법이 있습니다. 하나는 코드 이고 다른 하나는 코드 { 2 , 1 } 입니다.{0,2}{2,1}
지정된 코드에 해당하는 생일 할당 횟수를 직접 계산할 수 있습니다. 이 숫자는 세 항의 곱입니다. 하나는 다항식 계수입니다. 이것은 분할 방식의 숫자 카운트 에 명 [ 1 ] 그룹 1 , [ 2 ] 의 그룹 (2) 등을. 그룹의 순서는 중요하지 않기 때문에, 우리는이 다항 계수로 분할 할 [ 1 ] ! [ 2 ] ! ⋯na[1]1a[2]2a[1]!a[2]!⋯; 그 역수는 두 번째 용어입니다. 마지막으로, 그룹을 구성하고 생일마다 할당 하십시오. 첫 번째 그룹 에는 후보가 있고 두 번째 그룹에는 b - 1 이 있습니다. 이 값을 곱하면 세 번째 항이됩니다. "인수 곱" b ( a [ 1 ] + a [ 2 ] + ⋯ )와 같습니다. 여기서 b ( m ) 은 b ( b - 1 ) ⋯ ( b − m + 1을 의미합니다.bb−1b(a[1]+a[2]+⋯)b(m) .b(b−1)⋯(b−m+1)
패턴의 카운트 관련된 명백한 및 아주 간단한 재귀있다 패턴의 카운트에 { [ 1 ] , ... , [ K - 1 ] } . 이를 통해 n의 적당한 값에 대한 카운트를 빠르게 계산할 수 있습니다 . 구체적 [ k는 ] 나타낸다 [ K를 ] 정확하게 공유 생년월일 K{a[1],…,a[k]}{a[1],…,a[k−1]}na[k]a[k]k사람들 각자. 이 후 [ K가 ] 그룹 K의 사람들로부터 인출 된 N 개의 수행 될 수있는 사람들, X 별개의 방법 (예를 들어), 그 패턴을 실현하는 방법의 수를 계산하기 위해 여전히 { [ 1 ] , ... , [ K - 1 ] } , 나머지 사람들 중. 이것을 x로 곱하면 재귀를 제공합니다.a[k]knx{a[1],…,a[k−1]}x
대한 닫힌 형식 공식이 의심 되는데 , 최대 항이 k 와 같은 n 의 모든 파티션에 대한 개수를 합산하여 얻습니다 . 몇 가지 예를 들어 보겠습니다.q(k;n,b)nk
와 (다섯 가지 생일) 및 N = 4 (사명) 우리 수득b=5n=4
q(1)q(2)q(3)q(4)=q(1;4,5)=360+60=120=420=80=5.
Whence, for example, the chance that three or more people out of four share the same "birthday" (out of 5 possible dates) equals (80+5)/625=0.136.
다른 예로, 및 n = 23을 사용하십시오 . 가장 작은 k에 대한 q ( k ; 23 , 365 ) 의 값은 다음과 같습니다 (6 시그 만).b=365n=23q(k;23,365)k
k=1:k=2:k=3:k=4:k=5:k=6:k=7:k=8:0.492700.4945920.01253080.0001728441.80449E−61.48722E−89.92255E−115.45195E−13.
Using this technique, we can readily compute that there is about a 50% chance of (at least) a three-way birthday collision among 87 people, a 50% chance of a four-way collision among 187, and a 50% chance of a five-way collision among 310 people. That last calculation starts taking a few seconds (in Mathematica, anyway) because the number of partitions to consider starts getting large. For substantially larger n we need an approximation.
One approximation is obtained by means of the Poisson distribution with expectation n/b, because we can view a birthday assignment as arising from b almost (but not quite) independent Poisson variables each with expectation n/b: the variable for any given possible birthday describes how many of the n people have that birthday. The distribution of the maximum is therefore approximately F(k)b where F is the Poisson CDF. This is not a rigorous argument, so let's do a little testing. The approximation for n=23, b=365 gives
k=1:k=2:k=3:k=4:0.4987830.4968030.0141870.000225115.
By comparing with the preceding you can see that the relative probabilities can be poor when they are small, but the absolute probabilities are reasonably well approximated to about 0.5%. Testing with a wide range of n and b suggests the approximation is usually about this good.
To wrap up, let's consider the original question: take n=10,000 (the number of observations) and b=1000000 (the number of possible "structures," approximately). The approximate distribution for the maximum number of "shared birthdays" is
k=1:k=2:k=3:k=4:k>4:00.8475+0.1520+0.0004+<1E−6.
(This is a fast calculation.) Clearly, observing one structure 10 times out of 10,000 would be highly significant. Because n and b are both large, I expect the approximation to work quite well here.
Incidentally, as Shane intimated, simulations can provide useful checks. A Mathematica simulation is created with a function like
simulate[n_, b_] := Max[Last[Transpose[Tally[RandomInteger[{0, b - 1}, n]]]]];
which is then iterated and summarized, as in this example which runs 10,000 iterations of the n=10000, b=1000000 case:
Tally[Table[simulate[10000, 1000000], {n, 1, 10000}]] // TableForm
Its output is
2 8503
3 1493
4 4
These frequencies closely agree with those predicted by the Poisson approximation.