matlab でガウス分布と一様分布で数値を生成したい。私はこの関数を知って randi
いrand()
ますが、それらはすべて正規 (ガウス) 分布です。一様分布で乱数を生成するにはどうすればよいですか?
6 に答える
0 と 1 の間の一様分布に使用rand(dimensions)
します。
平均がmuで標準偏差がsigmaのガウス分布に使用randn(dimensions) * sqrt(sigma) + mu
します。
randn
ガウス分布変数を生成する関数です (一様分布変数を生成します) randi
。rand
rand() から任意の分布を生成できます。
たとえば、レイリー距離の 100000 サンプルを生成したいとします。これを行う方法は、その特定の関数の累積分布関数を逆にすることです。基本的な考え方は、累積分布関数が 0 と 1 の間でなければならないので、次を見つけることができるということです。 cdf b/w 0 と 1 の値を入力することによる確率変数の値。レイリーの場合、次のようになります。
for i = 1:100000
data(i) = (2*sigma^2 *(-(log(1 - rand(1,1)))))^.5;
end
ガウス分布についても同様のことができます。
おめでとう、あなたはすでにガウス分布で疑似乱数を生成しています。正規分布はそれと同義です。
私があなたの質問から得ることができる他の唯一の解釈は、平均 != 0 および/または分散 != 1 を持つものが欲しいということです。それを行うには、単純にmean + sqrt(var) * randn(X)
.
raj の回答に続いて、Box-Muller Transformを使用すると、独立した標準正規/ガウス乱数を生成できます。
N = 1e6; z = sqrt(-2*log(rand(N, 1))) .* cos(2*pi * rand(N, 1)); figure; hist(z, 100)
N = 1e6; z = sqrt(-2*log(rand(N, 1))) .* sin(2*pi * rand(N, 1)); figure; hist(z, 100)
逆変換法を適用する場合は、逆相補誤差関数 (erfcinv) を使用できます。
N = 1e6; z = -sqrt(2) * erfcinv(2 * rand(1e6, 1)); figure; hist(z, 100)
randn
しかし、私はうまくいくことを願っています。