平成13年8月16日

[流れ星]

    第80回数学的な応募問題の解答

     <解答募集期間:8月1日〜8月15日>

[誕生日]

太郎さんは、先日、読者の方からこんな投稿問題を頂きましたので、今回の応募問題にしました。

私,ぷりっぷ@大学院生です.
ちょっと面白い問題を考えたので,よかったら取り上げてもらえるとうれしいです.

問題1 17人いて,誕生日が同じ人が少なくとも1組いる確率は?

問題2 17人いて,誕生日が同じもしくは1日違いの人が少なくとも1組いる確率?

17はN人でも構わないそうですから、追加します。

問題3 N人いて,誕生日が同じ人が少なくとも1組いる確率は?

問題4 N人いて,誕生日が同じもしくは1日違いの人が少なくとも1組いる確率?

<ぷりっぷさんのコメント>

問題1は,そんなに難しくありません.

問題2は,高校数学で解けると思うのですが(解答は思いついている)

     結構,考えさせられ,良問だと思っております.

 

NO1<ぷりっぷ>さんからの事前の解答 7/27 受信 更新 8/15
一年がN日、k人として、誕生日が同じ人もしくは一日違いの人が少なくとも1組いる確率は、
1−P[N−K−1,K−1]/N^(K-1)
 かなり検討した結果なので、おそらく正しいと信じている(自身はないですが)

NO2< kashiwagit>さんからの解答 8/06,8:04 受信 更新 8/15
  おはようございます。解答を送付致します。
  (1)0.315
  (2)0.690
  解法は背反事象を使いました。
  (1)1−(365/365×364/365-------×349/365)
  (2)1−(365/365×362/365-------×317/365)
  因ってNの場合も
  (3)1−(365/365×364/365-------×365−(N−1)/365)
  (4)1−(365/365×362/365-------×365−3(N−1)/365)
  となります。これではダメですか?
                               以   上.

NO3< 清川(kiyo>さんからの解答 8/07,20:09 受信 更新 8/15
いつもお世話になっています。kiyoです。
解答
   365日で、2月29日の誕生日の人はいないものとする。余事象で考える。
問題1 17人いて,誕生日が同じ人が少なくとも1組いる確率は?
 誕生日がすべて異なる場合の数
  P(365,17)=24812150535979326027436183639253104435200000
  可能なすべての場合の数
 365^17=36222522908554152439937566316950225830078125
 1-P(365,17)/(365^17)=0.3150

問題2 17人いて,誕生日が同じもしくは1日違いの人が少なくとも1組いる確率?
   誕生日が少なくとも1日は離れている場合の数
    17!*(C(348,17)+C(347,16))=11352425632876323984966133883451681116160000
           したがって求める確率は、
           1-(17!*(C(348,17)+C(347,16)))/(365^17)=0.6865920780

問題3 N人いて,誕生日が同じ人が少なくとも1組いる確率は?
N>365 の場合は明らかに、確率は1となる。
N<=365
1-(365PN)/(365^N)

問題4 N人いて,誕生日が同じもしくは1日違いの人が少なくとも1組いる確率?
     1-(N!*(C(365-N,N)+C(364-N,N-1)))/(365^N)

NO4<キューダ >さんからの解答 8/07,19:41 受信 更新 8/15
キューダと申します。初投稿(?)です。よろしくお願いします。
早速解答ですが、...
閏年は無視し、一年は365日とします。
また、無用な気遣いかも知れませんが、12月31と1月1日は「一日違い」
=「一日離れている」として、解くことにします。が、...
問題1〜4を一般化、かつ、拡張して、次のような問題を考えることにします。
【問題α】
N人いて、どの二人の誕生日もD日以上離れている確率を求めよ。
ただし、この世界の一年は、M日とする。

αでは、与えられた問題の余事象を求めている事に注意すると、αの解を、
P(M,N,D)とすると、問題1〜4の答えはそれぞれ

問題1:  1−P(365,17,1)
問題2:  1−P(365,17,2)
問題3:  1−P(365, N,1)
問題4:  1−P(365, N,2)

となります。
【解ofα】

1.N人の中から誰か一人(Aさん)を選び出します。

2.Aさんの誕生日を1、翌日を2、...として、一年全ての日に1からMま
 での通し番号を付けます。そして残り、N−1人の誕生日が、この通し番号の
 どれになるかをチェックします。

3.誕生日の通し番号の小さい順に並べ、それぞれを
 a_1(=1),a_2,...,a_N
 と表すことにします。

4.次のものを計算します。
 b_k = a_k+1 − a_k   (1≦k≦N-1)
 b_N = M + a_1 − a_N
 すると当然、このように計算したb_iについては、次の式が成り立ちます。
 b_1 + b_2 + ... + b_N = M

5.ところで、問題αを満たすような誕生日の集合があった場合には、
 b_k≧D (1≦k≦N)
 が成立します。

6.そこで、
 c_k = b_k − D (1≦k≦N)
 と言うものを定義すると、αを満たすような誕生日の配置パターン(これはA
 さんを除くN−1人の、Aさんを基準とする配置パターン、ただし、N−1人
 は、区別していない)の数は、

 c_1 + c_2 + ... + c_N = M − D*N

 を満たす非負整数解の個数を求める問題に代わります。

 この解の個数は、M−D*N個のものを一列に並べ、これにN−1本の仕切を
 入れる場合の数に一致するので、Combination(M−D*N+N−1,N−1)
 通りあることが分かります。


7.Aさんの誕生日がM通りあること、Aさん以外のN−1人の入れ替わりが、
 (N−1)!通りあること、これらに注意すると、

P(M,N,D)= M * (N-1)! * Combination(M-D*N+N-1,N-1) / M^N
        = Permutation(M-D*N+N-1,N-1) / M^(N-1)

これが問題αの解であることが分かります。               ■
【解答】
問題1:
  1 - P(364,16) / 365^16

     50018070674300608931512910367987381457
 = -----------------------------------------
    158783662064894914805205770156494140625

 = 0.3150076652965606...


問題2:

  1 - P(347,16) / 365^16

    545098022480609938739099888953392760853
 = -----------------------------------------

    793918310324474574026028850782470703125

 = 0.6865920780411631...
問題3:

  1 - P(364,N-1) / 365^(N-1)
問題4:
  1 - P(364-N,N-1) / 365^(N-1)

NO5<キューダ >さんからのコメント 8/09,02:37 受信 更新 8/15

ところで、なぜ、問題1,2では、N=17だったんでしょうね?
解く前は、解となる数値に、何かおもしろい特徴でもあるのだろうかと考えてい
たのですが、そうでもないようで...。
単に彼の研究室の人数が17人だったんでしょうかね。


<水の流れ:コメント>今回は、読者の方からの投稿問題でした。ありがとうございます。
 さらに、問題を作成するときは、あらゆることを想定しておかないと、解答者の方に誤解を招くことがわかりました。たとえば、1年を365日か、366日か。また、一日違いとは12月31日と1月1日も含めるのか、そうでないとするのか。反省します。

解答者の方とは、2・3回連絡を取り、過程を確認しながら、最終的なものを載せました。

NO6<ぷりっぷ>さんからの出題の意図 8/15 受信 更新 8/16
取り上げてくださいましてありがとうございました.17人にする理由はほとんどなく,キューダさんのご指摘の通りでした
実計算がめんどうになるだけでした.(ご推測の通り,これが話題になったのがキャンプに参加した人数が17人で
誕生日の1日違いが3組,計6人もいたことがきっかけでした)

この問題を普通に解くと,NO2< kashiwagit>さんのように解答しやすと思います.しかし,この解答では,下記の事例を数え忘れていることになります.
(例 ●○●○●○●・・・  ●:ある人の誕生日, ○:空白日)また,それに気づいた場合でも,2,3人であれば場合の数を数え上げることも容易なので,一般化して問題を解かなくてもすみます.

17人というのは,上記のような例外を数え上げることを断念させるという意味では有効かもしれません.
でも,それなら最初から文字で問題を出した方が良いという話になりますね.やっぱり.
最終的な解答形式は,下記でしょうか.
一年がN日、k人とすると (ただし,一年の最初の日と最後の日は1日違いとする)
  1-{ P[N-K,K] + P[N-K-1,K-1]*K} / N^K 式1
or 1 - P[N-K-1,K-1} / N^(K-1) 式2
最後に重ね重ねありがとうございました.

ちなみに,私が解答にたどり着いた考え方は,誕生日の日の必ず隣の日は空白日となることから,この誕生日の日と誕生日の日プラス1日の二日をセットとして考えることでした.別にマイナス日も空白日になるのですが常に片方だけを空白日とすることで,誕生日のマイナス1日も空白日にすることが担保されます. ->P[N-K,K] になります.

しかしながら,誕生日の日と誕生日プラス1日をセットとしているために
P[N-K,K]だけでは,1年の最終日に誕生日の人が来る場合の数を数え忘れていることになります.
その場合の数は, P[N-K-1,K-1]*K となります.

なお,余事象をとること,分母がN^Kになることなどは説明いらないと思います.
こうして,出てきた結果が式1になります.

式2は式1を変形すると出てきます.
NO7<浜田>さんの解答 8/21 受信 更新 8/29
簡単にする為に,誕生日を1月1日→0, 1月2日→1,・・・,2月28日→58,2月29日→59,3月1日→60,・・・,12月31日→365と,0〜365の数で表すことにする.
 誕生日が2月29日になる確率は,他の日に比べて97/400倍となることに注意する.なぜなら閏年は4年に1回あり,400年に3回ないからである(そういう意味で,去年の2000年の閏年は大変珍しいものであった).ただし,2月29日以外の日が誕生日になる確率は,数学的にそれぞれ等しいとする.生物学的,医学的には,違うのであろうが,それは数学で扱う問題ではない.
 問題1,3では,乱数を使い,17人,あるいはN人の誕生日を1人ずつ決めていき,等しい日が1組でもあればカウントする.そしてそれ以降の誕生日はもう計算しなくて済むことになる.
 問題2,4でも,乱数を使い,17人,あるいはN人の誕生日を1人ずつ決めていき,差の絶対値が1以下である日が1組でもあればカウントし,それ以降の誕生日は計算しない.ただし2月29日は,この問題を計算している年が閏年であれば,2月28日,3月1日とそれぞれ1日違いであるが,閏年でなければ1日違いではない.その年の2月29日が存在しないからである(実際には2月29日生まれの人は,閏年以外の年には2月28日,または3月1日に誕生日を祝うようである.しかしかわいそうであるがそれは数学的な問題ではない).
 しかし例外的に,2月29日同士の人は,閏年でなくても同じ誕生日とした.
 また2月28日と3月1日は閏年のときは2日違いであるが,閏年以外の年では1日違いである.
 また差の絶対値が365となるのは,1月1日と12月31日の場合であるが,この場合実際には差の絶対値は1となる.
 これらのことを考慮し,答の確率を求めるプログラムをエクセルのマクロで作ってみた.
 最初にシート,問題12,問題3,問題4を用意し,
  問題1をマクロMacro1で,シート問題12上にて,
  問題2をマクロMacro2で,シート問題12上にて,
  問題3をマクロMacro3で,シート問題3上にて,
  問題4をマクロMacro4で,シート問題4上にて,
解く.
 結果は,
  問題1は,0.31265(試行回数100000回)
  問題2は,0.70773(試行回数100000回)
  問題3は,N,確率を表にすると(試行回数10000回),
1 0
2 0.0027
3 0.0082
4 0.0176
5 0.0244
6 0.041
7 0.0573
8 0.0692
9 0.0925
10 0.1182
11 0.1437
12 0.1701
13 0.1914
14 0.2214
15 0.2515
16 0.2802
17 0.3169
18 0.3462
19 0.3816
20 0.4131
21 0.4446
22 0.4738
23 0.502
24 0.5347
25 0.5629
26 0.5992
27 0.6282
28 0.6607
29 0.6813
30 0.7033
31 0.7375
32 0.7574
33 0.7677
34 0.7921
35 0.8091
36 0.8353
37 0.8448
38 0.865
39 0.8751
40 0.8913
41 0.9038
42 0.9158
43 0.9242
44 0.9356
45 0.9423
46 0.9474
47 0.9556
48 0.9607
49 0.964
50 0.9696
51 0.9741
52 0.9772
53 0.9826
54 0.9838
55 0.9863
56 0.988
57 0.9896
58 0.9912
59 0.9932
60 0.9937
61 0.9961
62 0.9955
63 0.997
64 0.9974
65 0.9975
66 0.9985
67 0.9973
68 0.9989
69 0.9994
70 0.9995
71 0.9995
72 0.9994
73 0.9994
74 0.9997
75 0.9999
76 0.9996
77 0.9999
78 0.9998
79 0.9997
80 0.9997
81 1
・・・
100 1

 


  問題4は,N,確率を表にすると(試行回数10000回),
1 0
2 0.0135
3 0.0323
4 0.0607
5 0.0972
6 0.134
7 0.1756
8 0.229
9 0.2833
10 0.3398
11 0.4048
12 0.4547
13 0.5134
14 0.5683
15 0.6118
16 0.6596
17 0.7043
18 0.7506
19 0.7896
20 0.8245
21 0.8467
22 0.8758
23 0.8982
24 0.917
25 0.9328
26 0.9485
27 0.9611
28 0.967
29 0.9734
30 0.9815
31 0.9843
32 0.9893
33 0.9938
34 0.995
35 0.9956
36 0.9973
37 0.9983
38 0.9986
39 0.9986
40 0.9986
41 0.9996
42 0.9996
43 0.9997
44 1
45 1
46 1
47 0.9998
48 1
49 0.9999
50 1
・・・
100 1
となる.

 


 本当はもう少し試行回数を増やしたいところであるが,気の短い私にとってそれは出来ない相談であった.

Option Explicit
Sub Macro1()
    Randomize Timer
    Dim shikoukaisuu As Long
    Dim kaisuu As Long
    Dim m As Integer
    Dim birthday(17) As Integer
    Dim deta As Integer
    Dim dame As Integer
    Dim j As Integer
    shikoukaisuu = 100000 '******
    Sheets("問題12").Select
    Cells(1, 1).Value = 0
    Cells(1, 3).Value = "=A1/B1"
    Range("C1").Select
    For kaisuu = 1 To shikoukaisuu
     deta = 0
     m = 1
     While deta = 0 And m <= 17
      Do
      birthday(m) = Int(366 * Rnd)
       'birthday=0->1/1, birthday=1->1/2, ..., birthday=59->2/29, ..., birthday=365->12/31
       If birthday(m) = 59 Then
       dame = -(Rnd >= 97 / 400) '閏年ではない
       Else
        dame = 0
        End If
        Loop While dame
        j = 1
        While deta = 0 And j < m
         deta = -(birthday(j) = birthday(m))
         j = j + 1
        Wend
        If deta Then
         Cells(1, 1).Value = Cells(1, 1).Value + 1
        Else
         m = m + 1
        End If
      Wend
      Cells(1, 2).Value = kaisuu
    Next kaisuu
End Sub
Sub Macro2()
    Randomize Timer
    Dim shikoukaisuu As Long
    Dim kaisuu As Long
    Dim m As Integer
    Dim birthday(17) As Integer
    Dim deta As Integer
    Dim dame As Integer
    Dim j As Integer
    Dim leap_year As Integer
    shikoukaisuu = 100000 '******
    Sheets("問題12").Select
    Cells(2, 1).Value = 0
    Cells(2, 3).Value = "=A2/B2"
    Range("C2").Select
    For kaisuu = 1 To shikoukaisuu
      deta = 0
      m = 1
      leap_year = -(Rnd < 97 / 400) '計算をしている年が閏年かどうか
      While deta = 0 And m <= 17
        Do
        birthday(m) = Int(366 * Rnd)
        If birthday(m) = 59 Then
        dame = -(Rnd >= 97 / 400) '閏年ではない
         Else
         dame = 0
         End If
        Loop While dame
        j = 1
        While deta = 0 And j < m
        deta = -(difference(birthday(j), birthday(m), leap_year) <= 1)
         j = j + 1
        Wend
        If deta Then
         Cells(2, 1).Value = Cells(2, 1).Value + 1
        Else
        m = m + 1
        End If
      Wend
      Cells(2, 2).Value = kaisuu
    Next kaisuu
End Sub
Private Function difference(ByVal day1 As Integer, ByVal day2 As Integer, ByVal leap_year As Integer) As Integer
    If day1 = day2 Then
    difference = 0
    ElseIf leap_year Then '閏年
      difference = Abs(day1 - day2)
      If difference = 365 Then '1/1と12/31は1日違い
        difference = 1
      ElseIf difference > 1 Then
        difference = 2
      End If
    Else '閏年でない
      If day1 = 59 Or day2 = 59 Then
        difference = 2 '2/29は存在しないので,差自体が存在しない
      ElseIf (day1 = 58 And day2 = 60) Or (day1 = 60 Or day2 = 58) Then
        difference = 1 '2/28と3/1は1日違い
      Else
        difference = Abs(day1 - day2)
        If difference = 365 Then
         difference = 1
        ElseIf difference > 1 Then
        difference = 2
        End If
      End If
    End If
End Function
Sub Macro3()
    Randomize Timer
    Dim shikoukaisuu As Long
    Dim kaisuu As Long
    Dim N As Integer
    Dim m As Integer
    Dim birthday(100) As Integer '******
    Dim deta As Integer
    Dim dame As Integer
    Dim j1 As Integer
    Dim j2 As Integer
    shikoukaisuu = 10000 '******
    Sheets("問題3").Select
    Cells(1, 1).Value = "N"
    Cells(1, 2).Value = "確率"
    For N = 1 To 100 '******
      Cells(N + 1, 1).Value = N
      Range("B" & (N + 1)).Select
      kaisuu = 0
      For j1 = 1 To shikoukaisuu
        deta = 0
        m = 1
        While deta = 0 And m <= N
          Do
          birthday(m) = Int(366 * Rnd)
          If birthday(m) = 59 Then
          dame = -(Rnd >= 97 / 400) '閏年ではない
          Else
            dame = 0
            End If
          Loop While dame
          j2 = 1
          While deta = 0 And j2 < m
           deta = -(birthday(j2) = birthday(m))
           j2 = j2 + 1
          Wend
          If deta Then
          kaisuu = kaisuu + 1
          Else
          m = m + 1
          End If
        Wend
        Cells(N + 1, 2).Value = kaisuu / j1
      Next j1
    Next N
    Range("A1").Select
End Sub
Sub Macro4()
    Randomize Timer
    Dim shikoukaisuu As Long
    Dim kaisuu As Long
    Dim N As Integer
    Dim m As Integer
    Dim birthday(100) As Integer '******
    Dim deta As Integer
    Dim dame As Integer
    Dim j1 As Integer
    Dim j2 As Integer
    Dim leap_year As Integer
    shikoukaisuu = 10000 '******
    Sheets("問題4").Select
    Cells(1, 1).Value = "N"
    Cells(1, 2).Value = "確率"
    For N = 1 To 100 '******
      Cells(N + 1, 1).Value = N
      Range("B" & (N + 1)).Select
      kaisuu = 0
      For j1 = 1 To shikoukaisuu
        deta = 0
        m = 1
        leap_year = -(Rnd < 97 / 400) '計算をしている年が閏年かどうか
        While deta = 0 And m <= N
          Do
            birthday(m) = Int(366 * Rnd)
            If birthday(m) = 59 Then
              dame = -(Rnd >= 97 / 400) '閏年ではない
            Else
              dame = 0
            End If
          Loop While dame
          j2 = 1
          While deta = 0 And j2 < m
            deta = -(difference(birthday(j2), birthday(m), leap_year) <= 1)
            j2 = j2 + 1
          Wend
          If deta Then
            kaisuu = kaisuu + 1
          Else
            m = m + 1
          End If
        Wend
        Cells(N + 1, 2).Value = kaisuu / j1
      Next j1
    Next N
    Range("A1").Select
End Sub

  <自宅>  mizuryu@aqua.ocn.ne.jp