モンテカルロ法は、乱数を用いて数値計算やシミュレーションを行う手法の総称です。確率的な現象の解析や、解析的に解くことが難しい問題の近似解を求める際に用いられます。
[PR]
SimPyとは
SimPyは、Pythonで離散事象シミュレーションを行うためのライブラリです。プロセス間の相互作用やリソースの共有など、複雑なシステムの振る舞いをモデル化し、シミュレーションすることができます。モンテカルロ法のような、乱数を用いたシミュレーションにも利用できます。
SimPyのインストール
SimPyはpipコマンドで簡単にインストールできます。
pip install simpy
モンテカルロシミュレーションの実装
以下のようなルールのサイコロゲームのシミュレーションをPythonで実装していきます。
ルール
- サイコロを1回振る
- 出目に応じて得点を計算する
- 1が出たら-1点
- 2か3が出たら+1点
- 4, 5, 6が出たら+2点
- 上記を多数回繰り返し、最終的な得点の分布を確認する
| 出目 | 得点 |
|---|---|
| 1 | -1 |
| 2 | +1 |
| 3 | +1 |
| 4 | +2 |
| 5 | +2 |
| 6 | +2 |
基本的な実装
まず、SimPyを使わずに、基本的なロジックを実装します。
import random def roll_dice(): return random.randint(1, 6) def calculate_score(number): if number == 1: return -1 elif number <= 3: return 1 else: return 2 def simulate_game(num_trials): total_score = 0 for _ in range(num_trials): total_score += calculate_score(roll_dice()) return total_score final_score = simulate_game(1000) print(f"Final score after 1000 trials: {final_score}")
random.randint(1, 6)で1から6のサイコロの目をシミュレートします。calculate_score関数で出目に応じた得点を計算します。simulate_game関数で指定回数シミュレーションを繰り返し、総得点を計算します。
SimPyを使った実装
次に、SimPyを用いて、時間経過の概念を取り入れ、より現実に近いシミュレーションを行います。
import simpy import random def dice_game(env, num_trials): total_score = 0 for i in range(num_trials): yield env.timeout(1) # 1単位時間経過 number = random.randint(1, 6) total_score += calculate_score(number) print(f"Final score after {num_trials} trials: {total_score}") env = simpy.Environment() env.process(dice_game(env, 1000)) env.run()
simpy.Environment()でシミュレーション環境を作成します。env.timeout(1)で1単位時間の経過を表現します (この時間は仮想的なものです)。env.process()でシミュレーションのプロセス (ここではdice_game) を登録します。env.run()でシミュレーションを実行します。
試行回数を増やすほど、得点の分布は特定の範囲に収束します(大数の法則)。複雑な確率的システム(待ち行列、在庫管理など)のシミュレーションに応用可能です。
まとめ
モンテカルロ法は、乱数を用いて様々な問題を解決するための強力な手法です。SimPyを組み合わせることで、Pythonで効率的にシミュレーションを実装できます。今回のサイコロゲームの例は基本的なものですが、より複雑な問題にも応用可能です。
最後にPythonの学習に利用できるUdemy
のサイトを紹介します。ぜひ活用ください。
[PR]