From 0f6edcadceed6433c2c98c421275b0bd3c9f96b6 Mon Sep 17 00:00:00 2001 From: chvmvd Date: Sun, 1 Jan 2023 22:58:03 +0900 Subject: [PATCH 1/2] Add monte carlo article --- docs/02advanced/05monte-carlo/index.mdx | 70 +++++++++++++++++++++++++ static/monte-carlo/calc_pi.ipynb | 43 +++++++++++++++ static/monte-carlo/coin_toss.ipynb | 41 +++++++++++++++ static/monte-carlo/dice.ipynb | 41 +++++++++++++++ static/monte-carlo/randint.ipynb | 33 ++++++++++++ static/monte-carlo/random.ipynb | 33 ++++++++++++ static/monte-carlo/randrange.ipynb | 33 ++++++++++++ static/monte-carlo/uniform.ipynb | 33 ++++++++++++ 8 files changed, 327 insertions(+) create mode 100644 static/monte-carlo/calc_pi.ipynb create mode 100644 static/monte-carlo/coin_toss.ipynb create mode 100644 static/monte-carlo/dice.ipynb create mode 100644 static/monte-carlo/randint.ipynb create mode 100644 static/monte-carlo/random.ipynb create mode 100644 static/monte-carlo/randrange.ipynb create mode 100644 static/monte-carlo/uniform.ipynb diff --git a/docs/02advanced/05monte-carlo/index.mdx b/docs/02advanced/05monte-carlo/index.mdx index f4fe35954..cfb0fbc0e 100644 --- a/docs/02advanced/05monte-carlo/index.mdx +++ b/docs/02advanced/05monte-carlo/index.mdx @@ -8,3 +8,73 @@ import Answer from "@site/src/components/Answer"; # モンテカルロ法 ここでは、モンテカルロ法について学んでいきます。 + +## モンテカルロ法とは + +世の中の現象は複雑なものが多いため、多くの問題は実際に厳密な解を求めることができません。そのため、コンピューターを用いて近似解を求める必要が出てきます。 + +近似解を求める方法はいくつもありますがその一つに、大量のランダムな値を与えてそれで実際に計算してみてその結果から確率を求めるというものがあります。このシミュレーションがモンテカルロ法です。 + +## 乱数 + +ここで、Python で乱数を扱う方法を学んでいきましょう。ただし、ここで扱う乱数は真乱数ではなく擬似乱数であることに注意が必要です。 + +### `random` 関数 + +`random` ライブラリの `random` 関数は、0 以上 1 未満の一様乱数を生成します。 + + + +### `uniform` 関数 + +`random` ライブラリの `uniform` 関数は、任意の範囲の一様乱数を生成します。 + +`uniform(a, b)` とすると、`a` 以上 `b` 以下の範囲の一様乱数を生成します。 + + + +### `randrange` 関数 + +`random` ライブラリの `randrange` 関数は、任意の範囲のランダムな整数を生成します。 + +`randrange(start, stop, step)` とすると、`start` 以上 `stop` 未満の範囲でランダムな整数を生成します。`step` でステップを指定できます。 + + + +### `randint` 関数 + +`random` ライブラリの `randint` 関数は、任意の範囲のランダムな整数を生成します。 + +`randint(a, b)` とすると、`a` 以上 `b` 以下の範囲のランダムな整数を生成します。 + + + +## モンテカルロ法でコイン投げ + +モンテカルロ法を用いてコイン投げで表が出る確率を求めてみましょう。表が出る確率が $\frac{1}{2}$ なのは、すでに知っていると思いますが、モンテカルロ法の練習としてみてみましょう。 + + + +実行回数を増やせば、精度がよくなります。 + +## モンテカルロ法で円周率 + +モンテカルロ法で円周率を求めてみましょう。 +次のように第一象限上で半径が 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$ となります。 + +これを使って、円周率を求めてみましょう。 + + + +## 練習問題 + +モンテカルロ法を用いて、サイコロ投げで 1 が出る確率を求めてみましょう。 + + + +$\frac{1}{6} = 0.166\cdots$ になるはずです。 + + + diff --git a/static/monte-carlo/calc_pi.ipynb b/static/monte-carlo/calc_pi.ipynb new file mode 100644 index 000000000..acb4c7434 --- /dev/null +++ b/static/monte-carlo/calc_pi.ipynb @@ -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 + } + ] +} diff --git a/static/monte-carlo/coin_toss.ipynb b/static/monte-carlo/coin_toss.ipynb new file mode 100644 index 000000000..211f56f8d --- /dev/null +++ b/static/monte-carlo/coin_toss.ipynb @@ -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 + } + ] +} diff --git a/static/monte-carlo/dice.ipynb b/static/monte-carlo/dice.ipynb new file mode 100644 index 000000000..7d47edb18 --- /dev/null +++ b/static/monte-carlo/dice.ipynb @@ -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 + } + ] +} diff --git a/static/monte-carlo/randint.ipynb b/static/monte-carlo/randint.ipynb new file mode 100644 index 000000000..67b50182a --- /dev/null +++ b/static/monte-carlo/randint.ipynb @@ -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 + } + ] +} diff --git a/static/monte-carlo/random.ipynb b/static/monte-carlo/random.ipynb new file mode 100644 index 000000000..73fed4d30 --- /dev/null +++ b/static/monte-carlo/random.ipynb @@ -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 + } + ] +} diff --git a/static/monte-carlo/randrange.ipynb b/static/monte-carlo/randrange.ipynb new file mode 100644 index 000000000..28f9347ff --- /dev/null +++ b/static/monte-carlo/randrange.ipynb @@ -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 + } + ] +} diff --git a/static/monte-carlo/uniform.ipynb b/static/monte-carlo/uniform.ipynb new file mode 100644 index 000000000..28d653f5d --- /dev/null +++ b/static/monte-carlo/uniform.ipynb @@ -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 + } + ] +} From 98b9fc9b0e422a0f1957a4ee01e55bac31b2c2b2 Mon Sep 17 00:00:00 2001 From: chvmvd Date: Sun, 1 Jan 2023 22:59:54 +0900 Subject: [PATCH 2/2] Update update history --- docs/index.mdx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/index.mdx b/docs/index.mdx index 32f23cd3d..1225e3b49 100644 --- a/docs/index.mdx +++ b/docs/index.mdx @@ -24,6 +24,10 @@ Python やアルゴリズムについて簡単にまとめていこうかなと ## 更新履歴 +1/1 第九週の分を執筆 モンテカルロ法 + +12/25 第十週の分を執筆 探索 + 12/11 第八週の分を執筆 再帰 12/4 第七週の分を増訂 物体の運動のシミュレーション