• ベストアンサー

正規乱数に歪度を考慮したい

あるソフトウェア上で正規分布に従う乱数を発生させる事は できています。そこから歪度を入れた分布で乱数を発生させたいと 考えています。そのソフトウェアではどうやら歪度を入れて 直接、乱数を発生させることはできなさそうなので 正規分布に従う乱数が一つずつ出てきたものを 何らかの数式で変換して 歪度を考慮したいと考えています。 この変換の方法はあるのでしょうか? どのような数式でできるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • chiezo2005
  • ベストアンサー率41% (634/1537)
回答No.1

P(x)を正規分布関数,もとめたい分布関数をQ(y)とします。 P(x)の正規分布関数に従う乱数は得られているとします。 変数変換y=f(x)をつかって正規分布関数P(x)をQ(y)の形に なるように変換できるf(x)を求めればよいと言う問題になります。 ∫P(x)dx=∫Q(y)dyですから, 積分のなかを変形してdy=f'(x)dxですから P(x)=Q(f(x))f'(x) となります。 ここでP(x)とQ(y)はあたえられていますから,上の式はf(x)についての 微分方程式になることがわかります。 これを解けばxに対して正規分布する乱数列x1,x2,x3・・・ をf(x)をつかってyに変換すれば f(x1),f(x2),f(x3)・・・ この数列はほしいQ(x)の確率分布をしている乱数列になります。

golioshikun
質問者

お礼

順序だててお書きくださり、考え方としてとても 参考になりました。お忙しい中、有難う御座いました。

関連するQ&A

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

    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を掛けるだけでもできますが、これは数学的に正しいのでしょうか?

  • 正規乱数とは

    学校の宿題ですがまず正規乱数の発生は2つの方法があるというのですが、意味がわかりません。 正規乱数でなんですか。 なぜ12個足して6をひくのですか。 また逆関数法の=NORMSINV(RAND()) てどういう意味ですか。 正規乱数の発生 1 一様乱数を12個足して6を引く方法 =RAND()+RAND()+・・・・+RAND() - 6 12個分 2 逆関数法 =NORMSINV(RAND())

  • 正規分布に従う乱数

    C言語で平均,標準偏差を指定して正規分布に従う乱数を発生させるにはどうしたらよいのでしょうか?

  • 正規分布に従う乱数を発生させるには?

    0以上1未満の実数のうちから均一な確率で乱数を発生できるものがあるとします。 (頭にあるのはプログラムのrnd関数です)。 この乱数をxとしたとき、このxを適当な変換式f=f(x)に代入して 正規分布に従うような数yを得たいと思います。 どうすればよいでしょうか?

  • 歪度はゼロに近いのに、ヒストグラムは正規分布してない

    以下のような20個のデータ(テストの点数)があります。 57, 82, 62, 53, 70, 69, 71, 68, 67, 72, 53, 75, 83, 69, 73, 70,66, 54, 54, 59 このデータの歪度をSPSSで算出すると、-0.01とほぼゼロに近い値だったので正規分布かなと思っていました。そこでヒストグラムを書いてみたら、全然正規分布とはほど遠い分布になっていました。 どうしてでしょうか?

  • 正規分布の歪度

    標準正規分布だけでなく、正規分布一般に、左右対称なので、歪度=0ですよね? モーメント母関数の3回微分にt=0を代入すると、m_3= 3mu*sigma^2+mu^3となります。 歪度はm_3/sigma^3で求められるとのことですが、このままいくと歪度=(3mu*sigma^2+mu^3)/sigma^2となってしまい、0にはなりません。 どこが間違っているのでしょうか。お教えください。

  • 正規分布の発生の仕方

    正規分布の発生の仕方について悩んでいます。 正規分布に従った平均と分散が違う乱数を独立に複数発生させて、 発生させた乱数を全て合わせるとそれも正規分布に従っているというものを作りたいのですがいい方法知っている方いらっしゃるでしょうか? これがものすごく必要で困っています。。。 よろしくお願いします。

  • 中心極限定理とボックスミュラーによる正規乱数の性質の相違

    中心極限定理とボックスミュラー法を用いて正規乱数を発生させるのですが、内容は『標準正規分布(0,1)に従う正規乱数を100000個発生させる』というものです。 タイトルの通り、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; }

  • 正規分布の乱数生成

    C言語で正規分布の乱数を発生させたいのですがどうすればいいのでしょうか? 自分なりにネットで検索して調べたのですが void gaussrand() { static double V1, V2, S; static int phase = 0; double X; if(phase == 0) { do { double U1 = (double)rand() / RAND_MAX; double U2 = (double)rand() / RAND_MAX; V1 = 2 * U1 - 1; V2 = 2 * U2 - 1; S = V1 * V1 + V2 * V2; } while(S >= 1 || S == 0); X = V1 * sqrt(-2 * log(S) / S); } else X = V2 * sqrt(-2 * log(S) / S); phase = 1 - phase; } こうありました。 例えば平均50の分散9の正規分布の乱数を1000個発生させて、配列seiki[1000]に代入したいときは、このプログラミングをどのようにすればいいのでしょうか? もちろん、このソースではなく、他のもので説明していただけても全然構いません。 また、もしよろしければ、正規分布の他に、二項分布など他の分布でのデータの生成方法もお教えいただけたら幸いです。 よろしくお願いいたします。