Pythonプログラミング(ステップ7・Box–Muller変換)
このページではBox–Muller変換による正規乱数の生成方法について考える(これから)。
1. 二次元のガウス分布
正規分布に従うような乱数の生成アルゴリズムについて考えてみよう。
前提として、[0,1]の区間の一様乱数を発生する仕掛けはすでに提供されているとする(Pythonの場合は、randomモジュールの中のrandom()
関数等)。
ここで、ちょっと遠回りして、平均0, 分散1で、互いに独立なガウス分布に従うような確率変数
次に、
2. 原点からの距離の分布
つぎに、原点から
3. 標準ガウス乱数の生成
以上をまとめると、正規乱数を発生するアルゴリズムは、以下の通りとなる:
- (0,1]区間の2つの独立な一様乱数
, を発生させる を計算 を計算 を求める を求める- それぞれ独立で平均0、分散1のガウス乱数
, が得られた。
この方法は、Box-Muller変換と呼ばれ、正規乱数を生成する際の標準的なアルゴリズムとしてよく使われている。
以下は、この方法で1対の乱数を生成し平面上にプロットするコードの例である。
import random import math import matplotlib.pyplot as plt def box_muller(): u1 = random.random() u2 = random.random() theta = 2*math.pi*u1 r = math.sqrt(-2*math.log(u2)) x = r * math.cos(theta) y = r * math.sin(theta) return x,y xlist=[] ylist=[] for n in range(2000): x,y = box_muller() xlist.append(x) ylist.append(y) plt.scatter(xlist,ylist, s=2, alpha=0.5) plt.xlabel('X') plt.ylabel('Y') plt.show()
上のコードの実行例。原点を中心とした等方的な「雲」のように点が分布している様子がわかる。
練習:マックスウェルボルツマン分布
物理の教科書を見ると、理想気体分子の「速さ」
ヒント
元々、無相関な気体分子が各方向にガウス分布に従うような速度分布をしているような状況から得られた分布関数であることを思い出す。
「エネルギー」