トランプと確率の問題

ネタ元
http://www.nyasoku.com/archives/50352203.html

ジョーカーを除いたトランプ52枚の中から1枚のカードを抜き出し、表を見ないで箱の中にしまった。そして、残りのカードをよく切ってから3枚抜き出したところ、3枚ともダイアであった。

このとき、箱の中のカードがダイヤである確率はいくらか。

という話で、

  1. 後に何を引いても最初のカードには影響しないので1/4
  2. 49枚中10枚ダイヤの可能性があるから10/49

という議論があるそうです。元々が大学入試の問題らしく、赤本では1/4が答えになってたそうで。

場合分けするなら

1. 最初のカードがダイヤで、次の3枚がダイヤの場合
1/4 * 12/51 * 11/50 * 10/49
2. 最初のカードがダイヤ以外で、次の3枚がダイヤの場合
3/4 * 13/51 * 12/50 * 11/49

(1の場合)/(1の場合+2の場合) の割合を取って10/(39+10) = 10/49・・・ってのが問題に沿った答えになるかな。49枚中10枚だから・・・ってのは、3枚ダイヤを引いた後に1枚引いたときの場合であって、厳密に言えば今回の問題に対する答えではない。結局は同じことなのですが。

まあ、「後から引いたカードは何の関係もないので1/4」なんてナンセンスもいいとこ。「このとき」というのは明らかに3枚のダイヤを情報として認識した後の話でしょう。

http://science4.2ch.net/test/read.cgi/math/1107189103/

44 :132人目の素数さん :2005/12/07(水) 13:00:06
ジョーカーを除いたトランプ52枚の中から1枚のカードを抜き出し、
表を見ないで箱の中にしまった。
そして、残りのカードをよく切ってから13枚抜き出したところ、
13枚ともダイアであった。
このとき、箱の中のカードがダイヤである確率はいくらか。

これも確立1/4というわけですね

受験生も大変ですね。

追記

ベイズ的アプローチで考えてみると、

  • 事象A:1枚目がダイヤである
  • 事象B:2, 3, 4枚目がダイヤである

としたとき、事象Bのもとでの事象Aの事後確率を求めるということになります。

P(A|B) = P(A)P(B|A)/(P(A)P(B|A)+P(not A)(B|not A))

ここで

  • P(A) = 1/4
  • P(B|A) = 12/51 * 11/50 * 10/49
  • P(not A) = 3/4
  • P(B|not A) = 13/51 * 12/50 * 11/49

従って、P(A)P(B|A)/(P(A)P(B|A)+P(not A)(B|not A)) = 10/49。まあ結局やってることは一緒。

そもそもベイズ的アプローチで考えるなら、事象Bを観測した時点の「事象Aの確率」という言葉がおかしい。「確率(probability)」という言葉を使うから紛らわしいのであって、事象Bを観測した時点の「事象Aの尤度(likelihood)」と言ったほうがずっとわかりやすい。

#include <stdio.h>
#include <time.h>

#define INTERVAL 10000000
#define SUFFLETIME 100
#define CARDS 52
#define ISDIAMOND(x) (x%4 == 0)

extern void init_genrand(unsigned long);
extern double genrand_real2(void);
void init(int[], int);

int main(){
     int i, card[CARDS], c1=0, c2=0;
     init_genrand((unsigned int)time(NULL));

     for(i=0; i<INTERVAL; i++){
          init(card, CARDS);
          if(ISDIAMOND(card[1]) && ISDIAMOND(card[2]) && ISDIAMOND(card[3])){
               (ISDIAMOND(card[0])) ? c1++ : c2++;
          }
     }
     printf("p = %f (%d/%d)\n", (double)c1/(double)(c1+c2), c1, c1+c2);
     return 0;
}

void init(int array[], int size)
{
    int i, i2, r, tmp;
    for(i=0; i<size; i++){
         array[i] = i;
    }
    for(i=0; i<SUFFLETIME; i++){
         i2  = i%size;
         r   = (int)(genrand_real2() * size);
         tmp = array[i2];
         array[i2] = array[r];
         array[r]  = tmp;
    }
}

こんな計算に使う必要も無いのですが、念のため乱数はMersenne Twister(http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html)を使っています。

p = 0.203558 (26399/129688)

10/49 = 0.204です。

ソースコードを見れば「3枚のダイヤを認識したもとで」という条件付きが明確でわかりやすいかも。あと、判定に使う配列のインデックスはユニークな4個ならば何でもよく、つまりカードを引く順番は何でもいいっていうのが直感的に分かるんじゃないかと。