はじめに

 みなさんは、「無限の猿定理」をご存じでしょうか。
 これは、「十分長い時間をかけてランダムに文字列を作り続ければ、どんな文字列もほとんど確実にできあがるという定理」であり、「比喩的に「猿がタイプライターの鍵盤をいつまでもランダムに叩きつづければ、ウィリアム・シェイクスピアの作品を打ち出す」などと表現されるため、この名がある。」とされています(ウィキペディアより)。

https://ja.wikipedia.org/wiki/%E7%84%A1%E9%99%90%E3%81%AE%E7%8C%BF%E5%AE%9A%E7%90%86

1 いろは歌くらいなら家庭用PCでも検証できる?

 最近ふと「さすがにシェイクスピアは無理でも、47字しかない「いろは歌」くらいだったら検証できるのでは?」と思ったのでpythonで検証してみました。

2 いろはモンキー1号

 というわけで、さっそく検証用のプログラム「いろはモンキー1号」を作ってみましょう。
 基本的な処理は、①いろは歌で使われている47字文字をセットする。②この47文字から1つずつ取り出してつなげていって47文字の文章を作成するという簡単なものです。
 この作業を繰り返していって、最終的に「いろは歌(いろはにほへとちりぬるをわかよたれそつねならむうゐのおくやまけふこえてあさきゆめみしゑひもせす)」と同じ文字列の生成を目指します。

【具体的な処理手順】
①いろは歌で使われている文字47字を文字リストにセット
②文字リストから、ちゃんとした「いろは歌」を生成
③文字リストから文字をランダムに1つ選んで文章用のリストに取り込む
④③の作業を47回繰り返す。
⑤文章用リストの中身を結合して文章を作る
⑥完成した文章と②で作成した「いろは歌」を比較する
⑦完成した文章と②で作成した「いろは歌」とが同じ文字列になっていれば処理を終了、なっていなければ文章を破棄して③から⑥までを繰り返す

 さっそく実装して試してみたのですが、いつまでたっても終わらないので途中終了。
 よく考えたら、この場合の組み合わせの数は47の47乗通りという天文学的数字になるので、家庭用PCでまっとうに検証できるわけがないですよね・・・

2 いろはモンキー2号

 というわけで、もっと現実的な時間で終わるよう、組み合わせの数を減らしていきます。
 まずは、使用する文字の重複禁止処理を追加してみました。これで、毎回47文字から1つを選ぶのではなく、まだ使用していない文字から選んでいくことになるので、組み合わせの数は47の階乗まで減少します・・・が、47の階乗もまだまだ天文学的数字です。
 2万5450回試行したあたりでまたもや途中終了。

3 いろはモンキー3号

 しかたがないので、さらに組み合わせの数を減らすべく、「いろは歌」の後ろの方から(「す」→「せ」→「も」・・・)固定していくことにしました。これにより天文学的数字だった組み合わせの数はどんどん減っていきます。

 最初から11文字めまでの組み合わせに限定すると3991万6800通り、10文字目までに限定すると36万28800通りと、このあたりで現実的な数字になってくるのですが、とりあえずは最初の7文字まで(「いろはにほへと」まで、組み合わせの数は5040通り)から検証してみます。

 実際にプログラムを動かした結果、「いろはにほへと」に到達するまでに要した試行回数は、以下のとおりです。
 1回目   1200回目で到達
 2回目 1万1505回目で到達
 3回目 2万9894回目で到達
 4回目 1万2298回目で到達
 5回目   4916回目で到達
 6回目    320回目で到達
 7回目   6959回目で到達
 8回目   2384回目で到達
 9回目   1529回目で到達
10回目 1万7863回目で到達
 最短320回~最長は2万9894回とかなりのばらつきがありましたが、わりとすぐに検証ができました。

4 いろはモンキー3の2号

 では、さらに一歩進めて「いろはにほへとち」(8文字)までではどうでしょうか。
 なお、この場合の組み合わせの数は、8の階乗の4万0320通りです。

 1回目  1万7735回目で到達
 2回目  6万5200回目で到達
 3回目  3万8062回目で到達
 4回目  1万4782回目で到達
 5回目 14万3668回目で到達
 6回目  8万7147回目で到達
 7回目  8万7410回目で到達
 8回目    3151回目で到達
 9回目  2万0548回目で到達
10回目  7万0164回目で到達

 まだそれなりの時間で検証ができます。最短3151回~最長14万3668回。

5 いろはモンキー3の3号

 さらに進んで「いろはにほへとちり」までの9文字ではどうでしょうか。
 この場合の組み合わせは9の階乗の36万2880通りです。

1回目 27万0322回目で到達
2回目 72万4476回目で到達
・・・このあたりでかなり家庭用PCの限界を感じたので2回で終了しました。組み合わせの数が36万2880通りくらいになると、家庭用PCで処理するのはちょっと大変なようです。

6 いろはモンキー1の2号

 ということで、組み合わせの数が36万通りより少なくなるように「いろはモンキー1号」を改造してみます。47の2乗が2209、3乗が10万3823、4乗が487万9681なので、最初から3文字くらいまでくらいですかね。
 条件を変更して、「いろは」までの3文字と合致するまでを検証します。これくらいなら、まだそれなりの時間で検証できるはず・・・

 1回目  15万8833回目で到達
 2回目   1万9470回目で到達
 3回目  19万3819回目で到達 
 4回目  15万0913回目で到達 
 5回目   1万3910回目で到達

 思ったより時間がかかりますが、これくらいならなんとか現実的な時間で試行できました。

7 いろはモンキー1の3号

 いちおう、「いろはに」までの4文字と合致するまでの検証もしてみましたが、試行回数220万8494回であきらめました。やっぱり現実的なところだと3文字くらいまでですかね。
 なお、最終結果は「れけたゐ」でした。

まとめ

 このように、運が良ければ1万4000回くらいの試行で「いろは」という組み合わせが出現します。
 そのため、これを残り44文字が合致するまでやり続けられれば、いつかは「いろは歌」が出現するものと考えられます。ただ、出現するまでどのくらいの時間がかかるのかは皆目検討がつきません・・・。

 結論1 たとえ全47文字の「いろは歌」であっても、無限の猿定理を家庭用PCで検証するのは無理
 結論2 無限のお猿さんに無限にタイプライターを叩かせ続ければ、いつかは「いろは歌」が完成する
     ・・・たぶん。
 結論3 もし「いろは歌」が完成したとしたら、それを叩き出したお猿さんは超絶ラッキー

 ちなみに、上記いろはモンキー1号~3号をずっと使っていなかったGithubにあげておきました。
 試してみたい方はhttps://github.com/misaki1987/iroha-monkey.gitからどうぞ。