コイントス


読んでいた本に、コインを5回投げて、オモテかウラが3回続けてでる確率は1/2と書いてありました。これをJ言語で確認してみました。

   +/ +./"1 (0 0 0 E."1 (#: i.32))
8

えっと、#:(シャープコロン)は右側引数を0と1の二進法のベクトルに変換しますので、#:i.32は0 0 0 0 0から1 1 1 1 1までの32行5列の行列を作ります。E.(ラージイードット)は左側の引数が右側引数のどこかにあればその最初に1が立ちます。0 0 0 E. 0 0 0 0 0ならば1 1 1 0 0が返ってきます。+.(プラスドット)はブール代数のORで、左右引数のどちらかが1(正)ならば1を返します。+./というようにベクトル全体に適用すると、ベクトル内がすべて0(偽)でない限り1を返します。E."1と+./"1の両方にある"1(クオートいち)は#:i.32で作られた行列の行方向に動詞を作用させるための副詞です。最後に+/で合計すると32個の例の中に0 0 0がある例が8個であることがわかります。1 1 1でも同様に8個ありますので、合計8 + 8 = 16 => 16 / 32 = 1 /2で、確率は1 / 2。


あといろいろ実験です。

   NB.3回投げて2回続けてでる確率は?
   i.8
0 1 2 3 4 5 6 7
   #:i.8
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
   (0 0 E."1 #:i.8)
1 1 0
1 0 0
0 0 0
0 0 0
0 1 0
0 0 0
0 0 0
0 0 0
   +./"1 (0 0 E."1 #:i.8)
1 1 0 0 1 0 0 0
   +/ +./"1 (0 0 E."1 #:i.8)
3

というわけで3 + 3 = 6 => 6 / 8 = 3 / 4の確率になりました。ふむ。
あ、これは問題が間違えてますね。
6回投げて4回はどうでしょうか。

   +/ +./"1 (0 0 0 E."1 (#: i.32))    
8
   +/ +./"1 (0 0 0 0 E."1 (#: i.64))   
8
   +/ +./"1 (0 0 0 0 0 E."1 (#: i.128))   
8
   +/ +./"1 (0 0 E."1 (#: i.16))    
8
   +/ +./"1 (0 E."1 (#: i.8))    
7
   +/ +./"1 (0 0 0 0 0 0 E."1 (#: i.256))   
8