フェルマー追記


とりあえず253を忘れて、まず単純なものからとサイコロから考えたら解けたっぽい。


サイコロで二人が違う目を出す確率は、二人目が一人目と違う目(5通り)を出せばいいので5/6。三人目も前の二人と違う目を出す確率は、三人目が前の二人と違う目(4通り)を出せばいいので、5/6*4/6で20/36・・・
なので、ひたすらやっていくとすると、5/6*4/6*3/6*2/6*1/6で、当然ながら出来るのは6人目までか。7人目はもう何の目を出してもダメだしな。とにかく、(7-x)/6を、x(人数)が増えるだけ掛け続けるということか。
つまり、7-xの累積/(6のx-1乗)(条件:x=2以上)か。3人なら、(7-2)*(7-3)/(6の2乗)で、20/36で0.55。数式の描き方忘れてるよ。なんかこういうの書く書式があったと思うんだけど。


で、確率は、

  • 2人:5/6=0.83...
  • 3人:20/36=0.55...
  • 4人:60/216=0.2788...
  • 5人:120/1296=0.926...
  • 6人:120/7776=0.015...
  • 7人:0


で、誰か二人でも目が一致するのは、1からこれを引いた値になるので、ついでにパーセンテージにすると、

  • 2人:17%
  • 3人:45%
  • 4人:72%
  • 5人:91%
  • 6人:99%
  • 7人:100%


次に誕生日で。二人が違う誕生日の確率は364/365。三人が違う確率は、364/365*363/365・・・
なので、364/365*363/365*・・・*(366-x)/365(xは人数)。
こちらは、(366-x)/365を、x(人数)が増えるだけ掛け続けるということで、
つまり、366-xの累積/(365のx-1乗)(条件:x=2以上)か。3人なら、(366-2)*(366-3)/(365の2乗)で、132132/133225で0.9917...

  • 2人:364/365=0.9972...
  • 3人:132132/133225=0.9917...
  • 4人:47831784/48627125=0.9836...


無理。23人出せナス。なんかフリーソフト無いかな。
考え方はあっていると思うのだが、とすると253がわからない。これを使えば、もっと簡単に計算できるということだろうか。


VB.NET 2005でチョイプロ作って確認完了。23人というのは、バラバラの確率をペアが出来る確率が上回る境目だった。
あと、考えてみたらx=1でも問題なかった。

人数 バラバラ ペア
2 99.726% 0.274%
3 99.18% 0.82%
10 88.305% 11.695%
14 77.69% 22.31%
17 68.499% 31.501%
20 58.856% 41.144%
22 52.43% 47.57%
23 49.27% 50.73%
27 37.314% 62.686%
30 29.368% 70.632%
35 18.562% 81.438%
41 9.685% 90.315%
57 0.988% 99.012%


ソース(VB.NET 2005)

    Public Class Form1
      Private idx As Integer
      Private num As Integer
      Private ans As Double
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ans = 1
        Try
          num = TextBox1.Text
        Catch ex As System.InvalidCastException
          Label_Err.Text = "人数には数字を入れろ"
          Exit Sub
        End Try
        If num < 1 Or num > 365 Then
          Label_Answer1.Text = "人数は1から365の間にしろ"
          Exit Sub
        End If
        For idx = 1 To num
          ans = ans * (366 - idx) / 365
        Next
        Label_Err.Text = ""
        Label_Answer1.Text = System.Math.Round(ans * 100, 3)
        Label_Answer2.Text = System.Math.Round(100 - Label_Answer1.Text, 3)
      End Sub
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Label_Answer1.Text = ""
        Label_Answer2.Text = ""
        Label_Err.Text = ""
      End Sub
    End Class