ザリガニを釣ろう
最近暑いんでね、ザリガニを釣ろうかなと思います。
と言ってもただザリガニを釣るんじゃ面白くない(いや面白いけど)のでね、今回は仮想用水路に赴いて仮想ザリガニを捕獲する仮想ザリガニ釣りをやります。
ザリガニが10匹の場合を考えましょう。このザリガニの1匹の長さを1マスとして、200マスある用水路内の全てのザリガニを捕獲します。
人間様である私がわざわざザリガニを釣るために彼らを探して自分から釣りにいくのは負けた気がして嫌なので、この用水路の端っこでじっと待っていましょう。割りばしの端っこにタコ糸を巻き、糸先にはコンビニで買った「さきいか」をくっつけます。
ザリガニはこの用水路内に定常に分布し、ランダムに動き回ります。
YOSUIRO <- rep(0,200) YOSUIRO[1:10] <- 1 set.seed(1) YOSUIRO <- sample(YOSUIRO ,size=200,replace=FALSE) YOSUIRO
## [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ## [38] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ## [75] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ## [112] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 ## [149] 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 ## [186] 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
例えばこれが一次元用水路内のザリガニの分布になってます。「1」がザリガニです。
sample(vec , size , replace)関数は、ベクトルvecの要素を、size回だけ無作為抽出し、それを並べる関数です。replaceをTRUEにするとこれは復元抽出、FALSEにすると非復元抽出です。vecに1:100、sizeを1にすれば、これは1,2,……,100の離散一様分布からの乱数として扱えます。
さっそくザリガニを釣っていきましょう。
最初は200マス中に10匹ザリガニがいますから、1回の試行で10/200=5%でザリガニがエサに食いつきます。エサに食いついたら100%でザリガニを釣れるとしましょう。
time <- 0 set.seed(1) while(sum(YOSUIRO) != 0 ){ number <- sample(1:200,size=1) if(YOSUIRO[number] == 1){YOSUIRO[number] <- 0} time <- time+1 } time
time ## [1] 676
ザリガニ釣り1回あたりの試行で1分かかるとすると、この用水路内のザリガニを根絶やしにするのに676分、全部で11時間ぐらいかかってしまいました。
仮想用水路は全国に無限個あるので、そのうち10000個の用水路内のザリガニ(10匹)を片っ端から釣ります。
time.vec <- c() set.seed(100) for( i in 1:10000){ YOSUIRO <- rep(0,200) YOSUIRO[1:10] <- 1 time <- 0 while(sum(YOSUIRO) != 0 ){ number <- sample(1:200,size=1) if(YOSUIRO[number] == 1){ YOSUIRO[number] <- 0 } time <- time+1 } time.vec[i] <- time } mean(time.vec)
mean(time.vec) ## [1] 583.0318
10000回繰り返してみた結果、200マスある一次元用水路内の10匹のザリガニを捕まえるのにかかる時間は、平均で583分、だいたい10時間かかるということがわかりました。
幾何分布
さて、仮想用水路200マスに潜むザリガニ10匹を釣り切るには平均して約583分かかるっぽいということがわかりましたが、これの理論上の値、つまり期待値はどのようにして求めることができるでしょうか。
これの計算には「幾何分布」Geo(p)を使うことができます。
1回あたり確率pで成功する事象を考えます。例えば均質なコインを投げたら表がでる確率はp=0.5ですが、表が出るまで投げたとき、投げた回数はどのような確率的振る舞いをするでしょうか?
表が出るかどうかはランダムですから、表が出るまで投げた回数もまたランダムに変動しますよね。つまり、確率変数なわけです。当たり前ですが投げた回数というのは自然数しかとりませんから、これは離散確率変数ですね。
1回あたり確率pで成功する事象をk回目で引き起こしたとき、これは言い換えればk-1回は失敗したことになります。失敗確率は1-pですから、(1-p)k-1 に、最後に成功する確率pをかけて、p(1-p)k-1が、成功するまで試行を繰り返すときに試行回数がk回である確率となります。この試行回数が従う分布のことを「幾何分布Geo(p)」と呼びます。
幾何分布に従う確率変数の期待値は1/pとなります。例えば確率0.2で成功するような事象を成功するまで繰り返すとき、繰り返し回数はだいたい5回くらいかな~というのは、まあなんとなくわかると思います。
(一応証明)
さて、ザリガニ釣りに戻りましょう。
今回は、先述した通り、まず10/200=5%の確率で1匹目のザリガニを釣ることができます。したがって、幾何分布の期待値が1/pであることより、1匹目のザリガニを釣るのにかかる平均回数は200/10=20回、となりますね。
1匹目を釣った後は、この1次元用水路に残るザリガニは9匹ですから、1匹目のザリガニを釣ったあと、2匹目のザリガニを釣るまでにかかる回数の期待値は200/9回となります。同様にして、3匹目のザリガニを釣るまでにかかる回数は200/8回、4匹目は200/7回、……、10匹目は200/1回となりますね。
以上より、
手計算はめんどくさいので機械を使って計算すると、この値は
Summation <- 0 for( i in 1:10){ Summation <- Summation + 200/i } Summation
Summation ## [1] 585.7937
585.7937回になるとわかりました。
ザリガニ全部を釣り終わるまでにだいたい585分=9時間と45分かかるわけですね。いや~大変ですな。