Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, 02-04-2010
さいころをいっぱい振ったときの最大値の 話.再び.
例えば
1:普通の6面のサイコロを4つ振る.一番大きい目が3の確率は?
2:4面,6面,8面のサイコロを2つずつ振る.一番大きい目が5の確率は?
ちなみに答は,1が 2.7%で,2が 16.0%.
この,サイコロ最大値の問題は,計算はやや面倒くさいけれど,考え方もプログラムも極めてシンプル.
サイコロの数を n,それぞれの面の数を m として,最大値が j になる確率は
非常にシンプルなことをめんどくさく書いてみた・・・
(シンプルな)考え方:4面,6面,8面のサイコロを1つずつ振る場合を例にする.
まず最大値が1になる場合を考える.3つのサイコロとも1を出さなくてはいけないので,その確率は
P1 = (1/4)(1/6)(1/8)
次に最大値が2になる場合:3つのサイコロとも1か2を出さなくてはいけないので,その確率は (2/4)(2/6)(2/8) ぽいのだけど,3つとも1だった場合 (確率は P1)を除かなくてはいけないので
P2 = (2/4)(2/6)(2/8) - P1
最大値が3になる場合:3つとも1か2か3を出さなくていけないんだけど,P1+P2 を引かなくてはいけないから
P3 = (3/4)(3/6)(3/8) - ( P1+P2 )
それで,上の式のような 掛け算 - 足し算 になる.最大値が j 以下になる確率は?だったら,マイナス足し算の部分がいらない.
で,min( j, mi ) なんだけど,これはただ単に,例えば「最大値が5」の確率の時は4面のサイコロはどうがんばっても貢献できないので,(5/4) となってしまう代わりに (4/4) にする処置.例1のように目の数が同じサイコロしか出てこない場合は無視してよい.
これを計算するコードはRなら2行で書ける.無理すれば1行で済むけれど.given.j <- function(j,v){ prod( pmin(v,j)/v) }
diff( sapply(as.list(0:max(v)), given.j, v=v) ) v が面の数.例えば例題2だったら, v <- rep(c(4,6,8),each=2) としてから走らせればよい.