単位円内部での一様乱数を作るには

問題

{A,B}は互いに独立な{[0,1]}区間内の値における一様乱数である。この2つを用いて{D=\{(x,y)\in\mathbb{R}^2|x^2+y^2\leq 1\}}内における一様乱数を作れ

解答

他に作り方はいくらでもあるかもしれないが、そのうちの1つは以下のようになる。

$$(X,Y)=(\sqrt{A}\cos{(2\pi B)},\sqrt{A}\sin{(2\pi B)})$$

証明

 とりあえず特性関数が同じであることを示せばOK

一様乱数の特性関数は以下のようになる。

$$f(p,q)=\iint_D \frac{1}{\pi}\exp(i(px+qy))dxdy$$

$$=\int_{0}^{2\pi}\int_{0}^{1}\frac{1}{\pi}\exp(ir(p\cos{\theta}+q\sin{\theta}))rdrd\theta$$

*1 

 

先程解答にあげたやつの特性関数は以下のようになる。

$$f(p,q)=\int_{0}^{1}\int_{0}^{1}\exp(i\sqrt{a}(p\cos(2\pi b)+q\sin(2\pi b)))dbda$$

 ここで、{2\pi b=\theta,\sqrt{a}=r}という置換をする。このとき

{\theta}{0}から{2\pi}までで{2\pi db=d\theta}

{r}{0}から{1}までで{da=2rdr}

となるため、これは

$$f(p,q)=\int_{0}^{2\pi}\int_{0}^{1}\exp(ir(p\cos\theta+q\sin\theta))\frac{2r}{2\pi}drd\theta$$

$$f(p,q)=\int_{0}^{2\pi}\int_{0}^{1}\frac{1}{\pi}\exp(ir(p\cos\theta+q\sin\theta))rdrd\theta$$

 よって2つの特性関数は一致するため、分布は一致する。

一般化

n次元単位球内での一様分布を作るにはどうしたらいいか

$$D=\{(x_1,\ldots,x_n)\in\mathbb{R}^n|x_1^2+\cdots+x_n^2\leq 1\}$$

内での一様分布について考える。

結論としては、恐らく

{\omega}という{\partial D=\{x\in\mathbb{R}^n|x_1^2+\cdots+x_n^2=1\}}上で一様分布を取るような乱数を持ってきたとき

$$\sqrt[n]{U}\omega$$

とすれば多分OKっぽい。ここで{U}{[0,1]}上の一様乱数である。

また、{\omega}の生成も難しくはない。

{X_1,\ldots,X_n}という正規乱数を用意した時、(正規乱数自体はボックスミューラー法で生成することができる。)

$$\omega=\frac{1}{\sqrt{X_1^2+\cdots+X_n^2}}\left(X_1,\ldots,X_n\right)$$

とすればOKである。

 

ここで、

$$\int_{\partial D}d\omega=1$$

に注意 

 

以下軽く証明

一様分布における特性関数は以下のようになる。

$$\int_{D}\frac{1}{V_n}\exp(i(\xi_1x_1+\cdots\xi_nx_n))dx_1\cdots x_n$$

$$=\int_{0}^{1}\int_{\partial D}\frac{1}{V_n}\exp(ir(\xi,\omega))S_nd\omega r^{n-1}dr$$

{r^n=u}と置換すると{nr^{n-1}dr=du}より

$$=\int_{0}^{1}\int_{\partial D}\frac{S_n}{nV_n}\exp(i(\xi,\sqrt[n]{u}\omega))d\omega du$$

ここで、{nV_n=S_n}となっているため、*2

$$=\int_{0}^{1}\int_{\partial D}\exp(i(\xi,\sqrt[n]{u}\omega))d\omega du$$

よりこれは{\sqrt[n]{u}\omega}の特性関数となっている。

重要性

2次元の単位円内部では以下のように生成すればOKである。

{X,Y}という{[-1,1]}内での一様分布を持ってくる({X,Y}は独立)

{X^2+Y^2\leq 1}なら{(X,Y)}を出力して終了

{X^2+Y^2\gt 1}なら①に戻ってやり直す

このような方法で生成するとき、理論上無限回の処理が必要になるかもしれない。しかし平均では{\frac{4}{\pi}}回で処理が終わることになる。*3この時点では現実的なアルゴリズムで問題ない。

しかしn次元に一般化すると以下のようになるはずである。

{X_1,\ldots,X_n}という{[-1,1]}内での一様分布を持ってくる({X_k}は互いに独立)

{X_1^2+\cdots+X_n^2\leq 1}なら{(X_1,\ldots,X_n)}を出力して終了

{X_1^2+\cdots+X_n^2\gt 1}なら①に戻ってやり直す

 この場合だとn次元球面の体積を{V_n}としたとき、平均で{\frac{2^n}{V_n}}回の処理が必要になる。{V_n\leq \pi^{n/2}}という評価ができるため、nが十分大きい状況を考えた時に必要な処理回数は発散してしまう。要はアルゴリズムとして高速ではなくなる。

そこで今回紹介した手法を使うと、一様乱数を高速に生成することができるのである。

*1:積分極座標変換をしている。{x=r\cos\theta,y=r\sin\theta}としたとき{dxdy=rdrd\theta}となる。

*2:ガバガバな証明:半径{R}のn次元球は体積が{V_nR^n}であり表面積が{S_nR^{n-1}}である。体積の式をRについて微分したものは表面積に等しくなる。よって{nV_nR^{n-1}=S_nR^{n-1}}であるため{nV_n=S_n}

*3:幾何分布の期待値を考えればよい