• 締切済み

規則に従った乱数

一様乱数を発生させるプログラムはネット上でも入手できます。ある種の確率密度分布に従った乱数を発生させるにはどうしたらいいでしょうか。 例えば0から1の乱数ですが、平均が0.5で分散が0.2のガウス分布に従った乱数を発生させるとしたら0.5に近いところの値が多く出て、0.9のあたりはあまり出ないということになります。そういう乱数です。 そういうものを乱数というのかどうかわかりませんが。 しかし、物理現象は何らかの分布に従う乱数のようなものと考えることができるのではないでしょうか。 よろしくお願いします。

みんなの回答

回答No.3

#2さんを支持します。 ある確率密度関数や確率質量関数に従う乱数というのは、 ある母集団からのサンプリングを模擬するもので、 物理現象を観測する代わりに モンテカルロ・シミュレーションとして用います。 その乱数の生成方法ですが、 通常は、逆関数法。注意が必要なのは、密度関数・質量関数ではなく、 累積分布関数の逆関数を求めて用いることです。 累積分布関数が陽に求められないようなケースでは、 フォンノイマンの棄却法を使います。 ちょっとコーディング(プログラムを書く)しなければなりませんが 数行です。

skmsk19410
質問者

お礼

解答有難うございます。 累積分布関数は与えられた確率密度関数pの積分ということでしょうか。例えば[0<x<a]が考える変数の最大のレンジで、pをゼロからxまで積分するというものです。ゼロからaまで(すなわち全区間)積分したら1になるということと、累積なので単調変化(増加とか減少)しかしないので[0,1]の範囲で乱数を発生したらそれに対応した値が1つ決まる(1価)となるということです。その場合、逆関数を定義する必要がありますね。これが陽に決まらない場合、”フォン・ノイマンの棄却法”を使うわけですか。 これはどうでしょうか。確率密度関数pの積分が求まらないのでモンテカルロ法で数値的に計算する。関数形を求めるとい意味ではなく、具体的な数値にしておきます。P(0),P(x1),P(x2)....P(a) このデータがあると、Pの一様乱数を発生させてP→xを求めることもできると思います。単調変化ですから。 具体的な関数形でなく、離散近似計算ですから誤差もある程度含みますが。

  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.2

正規分布に従う擬似乱数の生成方法を知りたいということですか? いろいろな方法がありますが、例えば、ボックス=ミュラー法 http://ja.wikipedia.org/wiki/%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%EF%BC%9D%E3%83%9F%E3%83%A5%E3%83%A9%E3%83%BC%E6%B3%95 あるいは、任意の確率密度関数に従う擬似乱数を生成する方法として、逆関数法([0,1]の一様分布乱数に累積分布関数の逆関数を適用する)、やフォンノイマンの棄却法、などがあります。

skmsk19410
質問者

お礼

早速の回答有難うございます。整理して考えたいのですが、発生確率Pに対する変数xがわかったとします。これが逆関数ということかと思います。普通は変数xの発生確率Pを求めるものだから向きが逆という理解です。 では、発生確率Pは0=<P<=1であり、ここを一様乱数で発生させる。そしてPの値に応じたxを求めれば、それがその確率分布に応じた変数xであり、あとは1000でも10000でも発生させればいいということでしょうか。 累積分布関数というのは確率密度関数の積分のようなものでしょうか。超過確率分布というようなものでしょうか。どうでしょうか。 少しそれてしまいますが、このやり方(確率密度関数が規定された乱数)で100個の乱数を発生させてその一位の値を調べるとします。それを100回やって平均をとると100回中の1位の平均が取れると思います。そのようなものはある確率密度関数に従うと決めた関数の順序統計というものなのかなと思いますが、どうでしょうか。もともとの疑問の原点は順序統計とはなにかということだったのですが。 よろしくお願いします。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

一般論的には, 分布関数の逆関数で一様乱数を変換すればいい. でも, ガウス分布ていどならちょっと探せばいくらでも見付かるんじゃないかな?

関連するQ&A

  • Mathematicaによる乱数生成について

    Mathematicaを用いて正規分布に係数をかけた物に従った乱数を生成したいのですが、ヘルプを調べても分からず困っています。 具体的に行いたいことは、 RandomReal[1/3*NormalDistribution[0,10], 100]          ~~~ のような事です。 正規分布の確率密度関数(平均0,分散10)に係数(ここでは1/3)をかけた分布に従う乱数を100個生成したいということです。 どなたか解決方法をご存知の方がいらっしゃいましたらよろしくお願いいたします。

  • 三角分布に従う乱数

    三角分布に従う乱数を発生させるプログラム 最頻値gで、0.8g~2.5gの範囲の三角分布(当然面積は1です)に従う乱数を発生させるプログラムを 書きたいと思っています。 この三角分布の確率密度関数をP(x)とすると、三角分布であるので最頻値gの左側である、傾きが正の直線h(x)と 最頻値gの右側である、傾きが負の直線f(x)で表せますよね 分布に従う乱数を発生させるためには、これら直線の関数を積分したものの逆関数x=P^-1(u) (Pのインバースです) (uは区間[0, 1]の一様乱数)とすればいいというところまでわかったんですが、 とりあえずh(x)とf(x)をそれぞれ積分して逆関数H^-1(u)、F^-1(u)を求めたところまではいいんですが x=H^-1(u)+F^-1(u)としてプログラムを実行すると、最頻値gの2倍あたりの値(例えば20に対して39など) しか出ず、最頻値gより小さい値が出ません。 H^-1(u)+F^-1(u)としているのがダメだと思うのですが、逆関数が2つある場合、ここからどうすればいいですか? また、初歩的な質問なのですが、区間[0, 1]の一様乱数というのはどう記述すればよいですか? ぜひ多くの方の回答お待ちしています。 よろしくお願いします。 (最頻値gは入力で与えるものとします)

  • 任意の標準偏差で正規分布の乱数を発生させたい

    2次元の正規分布の乱数を発生させたいんですが、 調べたところ、 平均0、分散1の正規分布の乱数の発生方法アルゴリズムが以下のものになることがわかりました。 「Box-Maller法:区間(0,1)の2個の一様乱数x1,x2と2個の量y1,y2との間の変換 y1=sqrt(-2*ln(x1))*cos(2*Pi*x2) y2=sqrt(-2*ln(x1))*sin(2*Pi*x2)」 ここで、平均0、分散0.2の正規分布の乱数を発生させたいのですが、どうすればよいでしょうか? 単純にy1,y2に0.2を掛けるだけでもできますが、これは数学的に正しいのでしょうか?

  • 標準正規分布の乱数

    RAND()関数は ((double)rand() / (1.0 + RAND_MAX))と定義します。 中心極限定理により、一様乱数を足し合わせると正規分布に近づくことから、 x = 分散 * (Σ[1~12]RAND() - 6) + 平均 で正規乱数が作れる。標準正規分布は分散1、平均0なのでその乱数は x = Σ[1~12]RAND() - 6 ですよね。この乱数を例えば100個羅列するにはどうしたらいいのでしょうか? もし間違ってたら指摘してください。 参考文献「Cによるシミュレーションプログラム 石川宏」 #include <stdio.h> #include <stdlib.h> #define RAND() ((double)rand() / (1.0 + RAND_MAX)) #define NUMBER 10000 /* 発生させる乱数の数 */ main(void) { int j; double u, x; srand(5); for (j = 0; j <= 11; j++) { u = u + RAND(); } x = u - 6.0; }

  • ベイズ統計の練習問題について

    ベイズ統計の練習問題のについてお尋ねします。 問題:1袋100g表示の袋が数多くあり、3つのサンプルを取り出して計測すると100,102,104gだったとします。 この袋の重さは分散1の正規分布であることが分かっている場合、袋の重さの事後分布を求めなさい。 ベイズの式は事後分布∝尤度×事前分布ということで、尤度と事前分布を求めて式を変形するようです。 回答によると 尤度:正規分布の式(平均=μ,分散1)に100,102,104のそれぞれを代入して得た表示式の積を取る。 事前分布:値100に対する正規分布(平均=μ,分散1)の値(表示式) として進めていきます。 ここで質問ですが、正規分布(確率密度関数)の式の値に積極的な意味があるのかなという気がして、どういうことなのだろうと思います。 確率密度関数はそれを積分したときに確率が表示されるものであり、積分しないと物理的な意味がないような気がするのですが。 さらに回答を読むと、事前分布について分散1に限定かと思ったら事前分布は未知なので(←いつもそう言われますが)分散を3にして計算してみる、ということになっています。これはなぜでしょうか。 3にしてみるという試行の結果を示すだけで回答が成立するものなのでしょうか。定期試験などで。3でないといけない理由が見出だせないのですが。 よろしくお願いします。

  • 一様乱数の期待値

    一様乱数の理論上の期待値の求め方を教えて下さい。確率密度関数が一定という条件を用いるようです。 -1~1の一様乱数R(n)を発生させるプログラムを作って、その結果得られた乱数の期待値((R(n)*R(n))/Nと理論上の期待値とを比較するためです。具体的には、sin波に一様乱数を加えて、SN比を求める問題です。 よろしくお願いします。

  • N個の一様乱数[0,1]の平均の分布

    N個の一様乱数(例えば[0,1])の平均はどのような確率分布になりますでしょうか。 また、一様乱数の平均を、適当な処理をして同じ区間で一様にできないものでしょうか。 何卒よろしくお願いいたします。

  • 乱数について

    こんばんは。 何度も申し訳ありませんが、今回は乱数について教えてください。 LinuxでCを勉強しているんですが、 randで乱数を発生させることはできたんですが、 そのプログラムを何度実行させても 出てきた乱数は同じ値なんです。 プログラム内で例えば10こ乱数を発生させたとすると 違うものが出ます。 しかし、もう一度そのプログラムをはしらせると 前回と全く同じ並びで同じ数が出るのはどうしてでしょうか? 言ってる意味わかっていただけましたでしょうか? 宜しくお願いします。

  • 乱数とは?

    乱数について、いくつか疑問に思っていることがあります。 乱数の定義は? 辞書には、 0から9までの一〇種類の数字が、それぞれ同じ確率で現れるように並べられた数字の列。 と、書いてあります。 と言うことは、各数字の現れる確率は10%です。 大量にDATAを取れば限りなく10%に近づくと言うことです。 そこで、 DATAが少ないと乱数にも偏った値が出て各数字10%にはなりません。 と言うことは、 各数字の発生確率が偏っている段階では、 次に現れる数字の予測がある程度可能だと思っていいのでしょうか? 確率の低い数字が出る確率が高い? そうなると、 予測が可能だと乱数とは言えないのではないでしょうか? 結果として確率が均等になればいいのであって、予測が出来る出来ないは関係ない?

  • プログラミングの乱数

    c言語、c++の乱数rand()の使い方がよくわかりません。わかりやすい説明をお願いします。 あと、プログラミングが得意な方にお願いです。 [0,1]乱数で平均と分散を求めるプログラムを配列なしで作ってください。