本記事は「日本語プログラミング言語「プロデル」 Advent Calendar 2021」21日目の記事です.
18日目の記事 で一般の確率分布に従う乱数サンプリングの手法について記述しましたが,今回はより基礎的な機能として
- シード値を固定した乱数生成
- 正規分布に従う乱数生成
を行います.
乱数シミュレーションでは再現のためシード値固定機能が必要です.
また,正規分布は必要になる場面が多いので高速で良質な1乱数が得られるボックス・ミュラー法を実装しました.
実装
乱数.rdr
線形合同法とは
ーー Park & Miller
+A:整数=48271
+B:整数=0
+M:整数=2^31-1
+X:長整数
はじめの手順
X=起動時間
『シャッフル』を10回繰り返す
終わり
シャッフルする手順
X=(A×X+B)%M
終わり
乱数を求める手順
シャッフルする
【Y:整数】=X
Yを返す
終わり
シードを設定する手順
X=設定値
シャッフルする
終わり
終わり
ボックスミュラー法とは
+X:浮動小数
+Y:浮動小数
フラグ:真偽値=×
乱数を求める手順
もしフラグならば
フラグ=×
Yを返す
そうでなければ
L=(0から1までの一様乱数の自然対数×(-2))の平方根
W=0から1までの一様乱数×2×円周率
X=L×cos(W)
Y=L×sin(W)
フラグ=○
Xを返す
もし終わり
終わり
終わり
[下限]以上で,[上限]未満の,整数一様乱数を求める手順
下限から上限までの一様乱数を切り捨てたものを返す
終わり
[下限]から,[上限]までの,一様乱数を求める手順
乱数生成器の乱数÷(2^31-1)×(上限-下限)+下限を返す
終わり
中心が,[μ]で,標準偏差が,[σ]の,ガウス乱数を求める手順
ガウス乱数生成器の乱数×σ+μを返す
終わり
[x]の,自然対数を求める手順
ネイピア数でxの対数を返す
終わり
[シード値]にシードをセットする手順
乱数生成器のシードは,シード値
終わり
ネイピア数=1の自然対数乗
乱数生成器=線形合同法を作ったもの
ガウス乱数生成器=ボックスミュラー法を作ったもの
一様乱数の生成に線形合同法,一様乱数からガウス乱数への変換にボックス・ミュラー法を使用しています.
シード固定機能のため線形合同法を実装していますが,不要であれば【値】の乱数
,【開始値】から【終了値】までの乱数
で十分です.
使い方
「C:\home\rdr\乱数.rdr」を参照する
42にシードをセットする
N=10
『
0以上で10未満の整数一様乱数を出力して改行
』をN回繰り返す
『
0から1までの一様乱数を出力して改行
』をN回繰り返す
『
中心が1で標準偏差が1のガウス乱数を出力して改行
』をN回繰り返す
- 【下限】以上で【上限】未満の整数一様乱数
- 【下限】から【上限】までの一様乱数
- 中心が【μ】で標準偏差が【σ】のガウス乱数
- 【シード値】にシードをセットする
日本語の意味そのままで動作します.
シードはすべての乱数で共通です2.明示的に指定しない場合はシステムの起動時間が指定されます.