概要
モンテカルロシミュレーションを行う際に必要となる平均0,標準偏差1の一様正規分布乱数をN個並べたリストをErlangで生成する関数のメモ。
Source
ndist.erl
-module(ndist).
-export([gen/1]).
%% Box-Muller変換関数
%% とりあえず簡易的にcosのみ。cosをsinに変えたものを使って2系統の生成が可能。
bm(X,Y) when is_number(X),is_number(Y) ->
math:sqrt(-2.0 * math:log(X)) * math:cos(2 * math:pi() * Y).
%% 必要な数の要素を作成
seq(N) when is_integer(N) ->
[A * random:uniform() || A <- lists:duplicate(N,1)].
%% 乱数生成
gen(N) when is_integer(N) ->
random:seed(now()),
[bm(X,Y) || {X,Y} <- lists:zip(seq(N),seq(N))];
gen(_N) ->
false.
使い方
$ erl
> c(ndist). # => {ok,ndist}
> ndist:gen(100). # => [0.12345,0.3214,-2.134...]
> s * (ndist:gen(100) + m) # => 平均値m、標準偏差sの一様正規分布乱数を生成する場合