サイトアイコン alm-ore

「底抜け」コミュ7種がトップに出てくる確率

俺のある日のコミュニティ欄

はじめに

先日から、当blog界隈で確率・統計が話題になっている。

発端は、「mixi のコミュニティ一覧がウザい日」という記事。

いきさつを簡単に説明する。
僕は mixi で44個のコミュニティに参加している。
そのうち、7つは「ちりとてちん」の登場人物に関するものである(以下「底抜けコミュ」と呼ぶ)。
さて、mixi のトップページには、自分の参加しているコミュニティの中から、9個が選ばれてリストアップされる
このとき、「底抜けコミュ」7つが全て選ばれる確率はどの程度か。

※なお、実際の mixi のコミュニティ選択アルゴリズムは、ランダムではないことがわかっている。理論上の数値よりも、かなり高い確率で7つが勢揃いするようになっている。

解答への挑戦 (数式編)

この問題を解くためには、「順列」と「組み合わせ」の概念を使えば良いことは想像がつく。
しかし、僕にはそれを使いこなすだけの能力が備わっていない。

初めに僕は、

1/44!/(44-7)!

などという、トンマな計算をやってる。
どうしてそうなるかの説明もないし、今となっては自分でも理解できない。

さて、そんな僕を見て、何人かの読者がこの問題にチャレンジしてくれた。

sterai 説

「7個の『底抜けコミュ』から7個取り出す組合せ」×「37個の『その他のコミュ』から2個取り出す組合せ」×それら9つのコミュの並べ方(順列)÷全ての並べ方、つまり、7C7×(44-7)C2×9P9÷44P9、ではないかと考えました。エクセルで計算すると、0.0001%くらいかと。

大彦説

全部で44のコミュニティがあって、そのうち表示されるコミュニティが9つあるのだから、全ての組合せは44P9ですね。で、7つは底抜けコミュで、2つはその他のコミュなわけね。2つのコミュが9つのいずれかに入る順列は9C2で、残りの42コミュから7つのコミュが取り出される組合せは 42P7だから、
9C2×42P7÷44P9≒0.019
じゃね? およそ2%の確率。

どっちも正しそうに見える。ただし、両者の確率の間にはなんと2万倍の開きがある。例えば、1日1回ずつトップページに配置されるコミュニティのアイコンがシャッフルされるとしよう。このとき、大彦説(2%)をとれば、年間に7日ほどは「底抜けコミュ」が7つ揃うことになる。しかし、sterai 説をとると、2740年に1度しかそういうことは起きない計算になる。

まったく意味が違う!
少なくとも一方は計算がおかしいのだろうなと思う。
#場合によっては、二人とも間違っているかもしれない。

もし、理路整然と正しい確率を説明できる人がいたら、ぜひ教えてください。

解答への挑戦 (シミュレーション)

ところで、sterai さんが「シミュレーションやりゃいいんじゃね?」みたいなことを言っていた。
そういうわけで、チラッとやってみた。

結論から述べる。僕のシミュレーション結果では、7つの「底抜け」コミュが全てトップに表示される確率は、およそ 0.0003%(多少誤差はある)。
100万回の並び替えを行っても、たった3回しか発生しなかった。毎日並び替えを行うと、約1000年に1度しか発生しない確率だ。

大彦説よりも、sterai説の方がはるかに近い。細かい値は一致しないが、誤差とみなしていいかもしれない。実際、写真でみても、3回のうち1回は 0.0006% という値が出てるなど安定しない。ただ、どう考えてもものすごく小さい確率であることには間違いがなさそうだ。

ちなみに、今回作ったVBプログラムのソース (VisualBasic)と実行ファイル(ComSim.exe)(要 .NET 環境。最近のWindows 環境なら普通に動くだろう)を置いておくので、点検したい方はどうぞ。

プログラムの利用方法

コマンドプロンプトで実行してください。
初めに、条件設定についていくつか質問されるので、キーボードで入力して Enter キーを押してください。
考えるのがめんどくさい人は、Enter を押しまくれば、初期値のまま動きます。

なお、ほとんどエラーチェックは入れてないので、紳士的に、半角英数字を使って値を入力してください。

1. 「何試行やりますか?」
試行数を増やすほど、信用できる結果が得られます。ただし、試行数を増やすと、結果が出るまでに時間がかかります。まずは、デフォルトの1,000回で様子を見て、コンピュータに余裕がありそうなら、徐々に増やしてください。

2. 「コミュニティは全部でいくつありますか?」
聞かれたとおりです。初期値は、僕の実際の mixi コミュニティ数にあわせて、44にしてあります。

3. 「底抜けコミュは全部でいくつありますか?」
聞かれたとおりです。「底抜けコミュ」とか言わなくてもいいのですが、僕の実際の mixi コミュニティにあわせてそういう表現にしました。初期値は、これまた実際にあわせて 7です。

4. 「途中結果を見ない場合はNを入力」
超お薦め機能。
100万回の試行数だって、10秒くらいで終わる!(ウチでは途中結果を見ると、15分くらいかかった)
#やっぱさぁ、画面表示って時間がかかるんだよねぇ。

結果の見方(途中経過)

画面表示をありにすると、途中経過を見ることができます。ちゃんとシャッフルされてるかどうかも確認できます。

左から順に
・試行数
・コミュニティをランダムに並べた結果
 アスタリスクは「底抜け」コミュ、ハイフンはそれ以外を表す
 左から9つのスロットを mixi のトップページとみなしている(タテ線で区切りを入れてある)
・OK: 7つ全てがトップに並んだ、NG: そうならなかった
 括弧内の数字は、トップページにアスタリスクが何個あるか
・これまでの試行で、何回OKが出たか

そして、最後の行には結果のサマリーを載せている。

プログラムがあっているか調べるために、いくつか条件を変えて調べた。まぁ、直感に反しない結果が得られることは確認した。
例えば、18個のコミュに入っていて、「底抜けコミュ」が1つだけの場合を考える(上の図)。スロットが18個あり、それはトップ掲載分のちょうど倍。ということは、たった1つの「底抜けコミュ」がトップに出るか否かは半々の確率。上の図ではおよそ50%になってるし、途中経過(20試行)も正しい。

プログラムのロジックに関して

プログラムでは、VisualBasic 標準の擬似乱数関数を使っているので、厳密なランダムが行われているとはいえない。しかし、まぁ、許容範囲だと思ってください。人の命や財産が関わるプログラムじゃないし、学術論文でもないし。つーか、僕の馴染みのある業界だと、どんな乱数の関数を使ったかなんて誰も気にしないし。

あと、コミュニティをシャッフルする時に使ったロジックも甘いかもしれない。配列を上から順番になめて行って、(自分自身を含めた)他のランダムな配列と入れ替えるというやり方。このやり方、別にそんなに悪くないんだよね?(証明とかは知らないし、もっと良いやりかたっつーのも知らないが)

というわけで、「順列」と「組み合わせ」を使って手で計算するだけの能力のない当方。某TK氏が言うところの、「貧者の数学」=コンピュータ・シミュレーションで計算してみました。

繰り返しになりますが、ちゃんと手で解ける賢い人、バシッと解いてください。
お願いします。

モバイルバージョンを終了