【ITニュース解説】A new journey restarted - the beginner step - Monte Carlo Method
2025年09月19日に「Dev.to」が公開したITニュース「A new journey restarted - the beginner step - Monte Carlo Method」について初心者にもわかりやすく解説しています。
ITニュース概要
モンテカルロ法は、不確実な事象の結果をランダムなシミュレーションによって推定する数学的手法だ。固定値ではなく、推定範囲に基づく多様な結果を予測する。コイントスの確率計算を例に、Pythonコードで確率をシミュレーションする仕組みが具体的に示されており、その基礎を学べる。
ITニュース解説
モンテカルロ法は、不確実な事象が起こりうる結果を推定するために用いられる数学的な手法である。この手法は、第二次世界大戦中にジョン・フォン・ノイマンとスタニスワフ・ウラムによって発明され、不確実な状況下での意思決定を改善する目的で開発された。通常の予測モデルが特定の固定された入力値に基づいて単一の結果を予測するのに対し、モンテカルロ法は、推定された値の範囲から多様な可能性のある結果のセットを予測する点が大きな特徴である。これにより、単一の予測値だけでなく、起こりうる様々な結果とその発生確率の分布を把握することが可能になる。
具体的な例として、コイン投げの確率を考えてみよう。例えば、「公平なコインを5回投げたときに、表が3回、裏が2回出る確率」という問題がある。数学的な確率論を用いると、この確率は約0.3125と計算できる。また、「公平なコインを5回投げたときに、最初に3回連続で表が出る確率」という別の問題では、数学的な確率論からその確率は0.125と導き出される。これらの値は、理論に基づき厳密に計算された答えである。
モンテカルロ法では、このような問題を、コンピュータ上で多数の試行をシミュレーションすることで、近似的に解き明かす。つまり、実際に多くの仮想的な試行を行い、その結果を集計することで確率を推定するのである。
最初の問題である「コインを5回投げたときに表が3回、裏が2回出る確率」をモンテカルロ法でシミュレーションする方法を見てみよう。提示されたPythonコードのcalculateprobability1関数がこのシミュレーションを実行する。この関数はattemptsという引数を取る。これは、コイン投げのシミュレーションを何回繰り返すか、すなわち試行の総回数を示す。
関数内では、successという変数が0で初期化される。これは、目的とする結果(表が3回、裏が2回)が得られた回数を記録するためのカウンターである。次に、attemptsで指定された回数だけループが実行される。このループの一回の繰り返しが、コインを5回投げる一連の試行に相当する。random.randint(0, 1)というPythonの関数は、0または1のいずれかの整数をランダムに生成する。ここでは、0を裏、1を表と見立てて、この関数を5回呼び出すことで5回のコイン投げの結果をシミュレーションしている。
生成された5つの乱数(0または1)の合計がsum_of_rollsに格納される。もしこの合計が3であった場合、それは5回のコイン投げのうち3回が表(1)で、残りの2回が裏(0)であったことを意味する。この条件が満たされた場合、successカウンターが1増える。全てのループが終了した後、successの合計をattemptsの合計で割ることで、目的の事象が発生する確率が推定される。例えば、10000回の試行で3100回成功したとすれば、確率は3100/10000 = 0.31となる。これは、数学的確率論による答えの0.3125に非常に近い値である。シミュレーションの試行回数を増やせば増やすほど、推定される確率は真の値にさらに近づく傾向がある。
次に、「コインを5回投げたときに最初に3回連続で表が出る確率」をモンテカルロ法でシミュレーションする方法を解説する。提示されたPythonコードのcalculateprobability2関数がこのシミュレーションを行う。ここでもattemptsはシミュレーションの繰り返し回数を指定する。
success変数は、目的とする結果(3回連続で表)が得られた回数を記録するために0で初期化される。ループの中では、random.randint(0, 1) == 1という条件が3回連続でチェックされる。これは、それぞれ独立したコイン投げで表(1)が出たかどうかを仮想的に確認することに相当する。もし最初の3回の乱数がすべて1(表)であった場合、すなわちrandom.randint(0, 1) == 1 and random.randint(0, 1) == 1 and random.randint(0, 1) == 1という条件が真になれば、successカウンターが1増える。これは、3回連続で表が出るという条件が満たされたことを意味する。
全てのループが実行された後、successの合計をattemptsの合計で割ることで、3回連続で表が出る確率が推定される。例えば、100000回の試行で12400回成功したとすれば、確率は12400/100000 = 0.124となる。これは、数学的確率論による答えの0.125に近い値である。ここでも、試行回数を増やせば増やすほど、推定される確率は真の値に近づいていく。
このように、モンテカルロ法は、ランダムな試行を多数回繰り返すことで、複雑な確率や統計の問題に対する近似的な解を求めることができる強力なツールである。特に、解析的に正確な解を導き出すのが困難な、多くの変数や不確実な要素が絡み合う現実世界の問題に対して、その価値を最大限に発揮する。例えば、金融商品のリスク評価、気象予報のモデリング、粒子物理学のシミュレーション、工学分野におけるシステムの信頼性評価など、多岐にわたる分野で幅広く活用されている。システムエンジニアを目指す者にとって、このようなシミュレーションの考え方や、それをプログラムとして実装する方法を理解することは、現実の複雑な問題をコンピュータの力で解決するための基礎となる重要な知識である。多数の試行を通じて答えを導き出すという直感的なアプローチは、プログラムによる自動化が容易であり、非常に汎用性が高いと言える。