VRMで正規乱数を得るには
VRMスクリプトで正規乱数を使いたい、というときにどうすればよいかというお話です。
「正規乱数」とは「正規分布に従う乱数」のことです。正規分布とは何のこっちゃいという話から始めると長くなって終わらなくなりますが、「平均のまわりはたくさん、平均から外れるほど少なくなる」ようなものです。テストの点数とか、近所の奥さんの体重とか、そういうものに見られる分布だと云われています。(下図は正規分布のイメージ(確率密度関数))
![]()
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
書き下すと短くはないですが、計算式自体は非常にシンプルで美しいと思います。
| 固定リンク
「VRM:研究」カテゴリの記事
- VRMNXの時間系イベントが使いにくいなあと思っているアナタへ(2019.12.24)
- [VRMNX] フレーム同期の話(2019.07.18)
- [Python] リスト型をベクトルに見立てて計算したい(2019.06.16)
- VRMNXのレイヤーベース地形を使ってみよう(前編)(2019.05.18)
- [VRMNX]自動踏切モジュール(2019.01.25)
この記事へのコメントは終了しました。


コメント