とりあえず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
End Class
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
End Sub
Try
num = TextBox1.Text
Catch ex As System.InvalidCastException
Label_Err.Text = "人数には数字を入れろ"
End Try
Exit Sub
If num < 1 Or num > 365 Then
Label_Answer1.Text = "人数は1から365の間にしろ"
End If
Exit Sub
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)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Label_Answer1.Text = ""
End Sub
Label_Answer2.Text = ""
Label_Err.Text = ""