答えを直接解かず、偶然の試行から近づく

複雑な問題では、式を立てられても計算が難しかったり、起こり得る組合せが多すぎて全部を調べられなかったりします。そこで、条件に合う入力を乱数で作り、同じ種類の計算を何度も行って、結果の分布や平均から答えを見積もるのがモンテカルロ法の基本的な発想です。厳密な答えを一度で出すのではなく、多数の試行を集計して近似値を得ます。

例えば、待ち時間や需要のように結果が一つに決まらない現象を考えるときは、起こりやすさを反映した入力を多数用意します。それぞれの入力で結果を計算すれば、「平均的にはどうなるか」「ある範囲を超えることはどれくらいあるか」を調べられます。現実の対象から必要な特徴を取り出すモデル化とシミュレーションと組み合わせることで、不確実さを含む問題をコンピュータ上で検討できます。

ただし、乱数を使えばどんな問題でも解けるわけではありません。何をランダムに変えるか、各値をどの確率で発生させるか、結果から何を測るかを先に決める必要があります。元となるモデルが現実から大きく外れていれば、試行回数だけを増やしても現実に合う答えにはなりません。

正方形に点を落として円周率を見積もる

仕組みが見えやすい例が、乱数で円周率を見積もる実験です。一辺の長さが1の正方形と、その一つの頂点を中心とする半径1の4分の1円を考えます。正方形の中に、横と縦の座標を乱数で決めた点を置きます。点の座標を x、y とすると、x²+y²≦1を満たす点は4分の1円の内側です。

点が正方形内に均等に現れるなら、「円の内側に入った点の数 ÷ 全点数」は、「4分の1円の面積 ÷ 正方形の面積」に近づきます。前者を4倍すれば、円周率の近似値が得られます。これは円周率の速い計算法ではありませんが、面積という問題を点の個数を数える問題へ置き換えるため、モンテカルロ法の流れを確かめやすい例です。

このとき、一つ一つの点は円内か円外かという結果しか持ちません。それでも、多数の点を一つの標本として集計すると、全体の面積比を推定できます。偶然にばらつく小さな観測を積み重ね、知りたい量へ結び付けるところが重要です。

乱数を結果に変える四つの段階

実際の処理は、まず対象を計算できる形のモデルにし、次に入力を乱数で生成し、その入力で計算し、最後に結果を集計する、という段階に分けられます。プログラムではこの一連の処理を繰り返し構造で実行します。試行ごとの結果を配列などに保存すれば、平均だけでなく、最大値や最小値、一定の条件を満たした割合なども求められます。

モンテカルロ法は、乱数そのものが答えなのではありません。乱数は、考えられる状況の一部を選び出すために使われます。選んだ状況に対する計算規則は、問題に合わせて設計したアルゴリズムです。そのため、入力の作り方と計算規則と集計方法のどれか一つでも目的に合っていないと、求めたい量とは違う値を計算してしまいます。

結果の読み取りでは、平均値などの代表値だけを見ると特徴を見落とす場合があります。同じ平均でも、結果が平均の近くに集まる場合と、広い範囲に散らばる場合があるためです。複数回の実行結果や値の分布も確認すると、推定がどれほど安定しているかを判断しやすくなります。

試行回数を増やしても誤差は消えない

乱数で選ぶ以上、同じ方法を実行しても毎回まったく同じ近似値になるとは限りません。試行が少ないと、たまたま特定の種類の入力が多く選ばれ、結果が大きく偏ることがあります。一般に試行回数を増やすと偶然によるばらつきは小さくなりますが、有限回の計算である限り、推定値と真の値との差が必ずゼロになるとはいえません。

また、試行回数を増やすほど計算量は増えます。試行ごとの結果を保存する設計なら、必要な記憶容量も増えます。回数を何倍かにしたからといって、誤差が同じ割合で小さくなるとは限りません。必要な精度、利用できる計算資源、結果を得るまでの時間を考え、どこで計算を止めるかを決めます。目的によっては、乱数の選び方を工夫してばらつきを抑える方法も使われます。

コンピュータ内部では実数を限られた桁で表すため、乱数によるばらつきとは別に浮動小数点数の誤差も生じ得ます。「たくさん繰り返したから正確」と決めつけず、モデルの妥当性、試行回数、計算上の誤差を分けて確認する必要があります。

カジノの地名と、再現できる「乱数」

モンテカルロはモナコ公国にある地区の名で、カジノで広く知られています。偶然性を利用する計算法に、賭け事を連想させる地名が付いているわけです。ただし、モンテカルロ法の目的は運任せに答えを当てることではありません。確率に従う試行を計画し、その集計結果から数量を推定する点に意味があります。

さらに、一般的なコンピュータプログラムが使う乱数の多くは、決められた計算によって作る「疑似乱数」です。出発点となる値をシードといい、同じ方式で同じシードを指定すると、同じ並びを再現できます。結果をもう一度確かめたい実験では、この再現性が役立ちます。一方で、生成される値に大きな偏りや不適切な規則性があれば推定にも影響するため、用途に合う乱数生成方法を選ぶことが欠かせません。