« 久々の動画です | トップページ | 大本営より自作車両ツールv.1.20の情報 »

VRMで正規乱数を得るには

VRMスクリプトで正規乱数を使いたい、というときにどうすればよいかというお話です。

正規乱数」とは「正規分布に従う乱数」のことです。正規分布とは何のこっちゃいという話から始めると長くなって終わらなくなりますが、「平均のまわりはたくさん、平均から外れるほど少なくなる」ようなものです。テストの点数とか、近所の奥さんの体重とか、そういうものに見られる分布だと云われています。(下図は正規分布のイメージ(確率密度関数))

DisNormal02.svg
By User:HiTe - Own work, Public Domain, Link

VRMスクリプトで乱数を得る方法というとrand命令と、その他毛の生えた様なのがいくつか。これらはすべて「一様乱数」というものであります。

rand命令は0.0から1.0の間で適当な数を取ってきます。平均は当然0.5です。が、平均の近くがたくさん出てくるわけではなく、0.0から1.0までおよそ均等に出てくる、と。これが一様乱数です。

VRMスクリプトで一様乱数から正規乱数を得る方法をご紹介します。

1. 中心極限定理を利用する方法

名前がカッコいいので、いきなり難しそうな漢字を並べてしまいました。英語では Central Limit Theorem というんですよ! セントラル・リミット・セオレムですよ!!

説明してもくどいので、いきなりサンプルコードです。

Var m
Var sig
setf m 0.0 // 平均
setf sig 1.0 // 標準偏差

Var randg // ここに正規乱数を得ます
Var r
Var counter

setf randg -6.0
set counter 0
:looplabel
rnd r
add randg r
add counter 1
if< counter 12
  jump looplabel
endif

mul randg sig
add randg m

DrawVar randg 

定数, sigを調整することで山の中心と裾の幅を調整することができます。上の例ではμ=0, σ=1 の標準正規分布に従うようになっています。

2. ボックスミュラー法

ボックスさんとミュラーさんが思いついた方法なのでこんな名前がついているそうです。

Var randg
Var m
Var sig
setf m 0.0 // 平均
setf sig 1.0 // 標準偏差

Var r1
Var r2
rnd r1
rnd r2

log r1 r1
mul r1 -2.0
sqrt randg r1

Var pi
pi pi
mul r2 pi
mul r2 2.0
cos r2 r2

mul randg r2

mul randg sig
add randg m

DrawVar randg

書き下すと短くはないですが、計算式自体は非常にシンプルで美しいと思います。

|

« 久々の動画です | トップページ | 大本営より自作車両ツールv.1.20の情報 »

VRM:研究」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: VRMで正規乱数を得るには:

« 久々の動画です | トップページ | 大本営より自作車両ツールv.1.20の情報 »