Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions docs/02advanced/05monte-carlo/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,73 @@ import Answer from "@site/src/components/Answer";
# モンテカルロ法

ここでは、モンテカルロ法について学んでいきます。

## モンテカルロ法とは

世の中の現象は複雑なものが多いため、多くの問題は実際に厳密な解を求めることができません。そのため、コンピューターを用いて近似解を求める必要が出てきます。

近似解を求める方法はいくつもありますがその一つに、大量のランダムな値を与えてそれで実際に計算してみてその結果から確率を求めるというものがあります。このシミュレーションがモンテカルロ法です。

## 乱数

ここで、Python で乱数を扱う方法を学んでいきましょう。ただし、ここで扱う乱数は真乱数ではなく擬似乱数であることに注意が必要です。

### `random` 関数

`random` ライブラリの `random` 関数は、0 以上 1 未満の一様乱数を生成します。

<ViewSource path="/monte-carlo/random.ipynb" />

### `uniform` 関数

`random` ライブラリの `uniform` 関数は、任意の範囲の一様乱数を生成します。

`uniform(a, b)` とすると、`a` 以上 `b` 以下の範囲の一様乱数を生成します。

<ViewSource path="/monte-carlo/uniform.ipynb" />

### `randrange` 関数

`random` ライブラリの `randrange` 関数は、任意の範囲のランダムな整数を生成します。

`randrange(start, stop, step)` とすると、`start` 以上 `stop` 未満の範囲でランダムな整数を生成します。`step` でステップを指定できます。

<ViewSource path="/monte-carlo/randrange.ipynb" />

### `randint` 関数

`random` ライブラリの `randint` 関数は、任意の範囲のランダムな整数を生成します。

`randint(a, b)` とすると、`a` 以上 `b` 以下の範囲のランダムな整数を生成します。

<ViewSource path="/monte-carlo/randint.ipynb" />

## モンテカルロ法でコイン投げ

モンテカルロ法を用いてコイン投げで表が出る確率を求めてみましょう。表が出る確率が $\frac{1}{2}$ なのは、すでに知っていると思いますが、モンテカルロ法の練習としてみてみましょう。

<ViewSource path="/monte-carlo/coin_toss.ipynb" />

実行回数を増やせば、精度がよくなります。

## モンテカルロ法で円周率

モンテカルロ法で円周率を求めてみましょう。
次のように第一象限上で半径が 1 の扇形を考えます。
$x$ 座標、$y$ 座標がともに $[0,1)$ の範囲にランダムに点をプロットしましょう。
扇形上の面積は、$\frac{1}{2} r^2 \frac{\pi}{2}$ なので、扇形の上に点が乗る確率は、$\frac{1}{2} r^2 \frac{\pi}{2} = \frac{1}{4}\pi$ となります。

これを使って、円周率を求めてみましょう。

<ViewSource path="/monte-carlo/calc_pi.ipynb" />

## 練習問題

モンテカルロ法を用いて、サイコロ投げで 1 が出る確率を求めてみましょう。

<Answer>

$\frac{1}{6} = 0.166\cdots$ になるはずです。

<ViewSource path="/monte-carlo/dice.ipynb" />
</Answer>
4 changes: 4 additions & 0 deletions docs/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ Python やアルゴリズムについて簡単にまとめていこうかなと

## 更新履歴

1/1 第九週の分を執筆 モンテカルロ法

12/25 第十週の分を執筆 探索

12/11 第八週の分を執筆 再帰

12/4 第七週の分を増訂 物体の運動のシミュレーション
Expand Down
43 changes: 43 additions & 0 deletions static/monte-carlo/calc_pi.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
{
"nbformat": 4,
"nbformat_minor": 2,
"metadata": {},
"cells": [
{
"metadata": {},
"source": [
"import random"
],
"cell_type": "code",
"outputs": [],
"execution_count": null
},
{
"metadata": {},
"source": [
"def calc_pi(n):\n",
" s = 0\n",
" for _ in range(n):\n",
" x = random.random()\n",
" y = random.random()\n",
" if x**2 + y**2 < 1:\n",
" s += 1\n",
" return s / n * 4\n",
"\n",
"\n",
"print(calc_pi(1000000))"
],
"cell_type": "code",
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"3.140648\n"
]
}
],
"execution_count": null
}
]
}
41 changes: 41 additions & 0 deletions static/monte-carlo/coin_toss.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
{
"nbformat": 4,
"nbformat_minor": 2,
"metadata": {},
"cells": [
{
"metadata": {},
"source": [
"import random"
],
"cell_type": "code",
"outputs": [],
"execution_count": null
},
{
"metadata": {},
"source": [
"def calc_coin_p(n):\n",
" head = 0\n",
" for _ in range(n):\n",
" if random.randint(0, 1) == 1:\n",
" head += 1\n",
" return head / n\n",
"\n",
"\n",
"print(calc_coin_p(100000))"
],
"cell_type": "code",
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"0.50153\n"
]
}
],
"execution_count": null
}
]
}
41 changes: 41 additions & 0 deletions static/monte-carlo/dice.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
{
"nbformat": 4,
"nbformat_minor": 2,
"metadata": {},
"cells": [
{
"metadata": {},
"source": [
"import random"
],
"cell_type": "code",
"outputs": [],
"execution_count": null
},
{
"metadata": {},
"source": [
"def calc_dice_p(n):\n",
" one = 0\n",
" for _ in range(n):\n",
" if random.randint(1, 6) == 1:\n",
" one += 1\n",
" return one / n\n",
"\n",
"\n",
"print(calc_dice_p(100000))"
],
"cell_type": "code",
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"0.1681\n"
]
}
],
"execution_count": null
}
]
}
33 changes: 33 additions & 0 deletions static/monte-carlo/randint.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
{
"nbformat": 4,
"nbformat_minor": 2,
"metadata": {},
"cells": [
{
"metadata": {},
"source": [
"import random"
],
"cell_type": "code",
"outputs": [],
"execution_count": null
},
{
"metadata": {},
"source": [
"print(random.randint(2, 4))"
],
"cell_type": "code",
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"4\n"
]
}
],
"execution_count": null
}
]
}
33 changes: 33 additions & 0 deletions static/monte-carlo/random.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
{
"nbformat": 4,
"nbformat_minor": 2,
"metadata": {},
"cells": [
{
"metadata": {},
"source": [
"import random"
],
"cell_type": "code",
"outputs": [],
"execution_count": null
},
{
"metadata": {},
"source": [
"print(random.random())"
],
"cell_type": "code",
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"0.701225927526422\n"
]
}
],
"execution_count": null
}
]
}
33 changes: 33 additions & 0 deletions static/monte-carlo/randrange.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
{
"nbformat": 4,
"nbformat_minor": 2,
"metadata": {},
"cells": [
{
"metadata": {},
"source": [
"import random"
],
"cell_type": "code",
"outputs": [],
"execution_count": null
},
{
"metadata": {},
"source": [
"print(random.randrange(2, 4, 1))"
],
"cell_type": "code",
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"3\n"
]
}
],
"execution_count": null
}
]
}
33 changes: 33 additions & 0 deletions static/monte-carlo/uniform.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
{
"nbformat": 4,
"nbformat_minor": 2,
"metadata": {},
"cells": [
{
"metadata": {},
"source": [
"import random"
],
"cell_type": "code",
"outputs": [],
"execution_count": null
},
{
"metadata": {},
"source": [
"print(random.uniform(2, 4))"
],
"cell_type": "code",
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"3.8650468552312107\n"
]
}
],
"execution_count": null
}
]
}