プログラムで正規乱数が必要なのですが、計算方法に苦戦しています。


ボックスミューラー法で任意の平均と分散の乱数を取得するところまではできたのですが、randomN(平均、分散)ではなく、randomN(最小、最大)で計算できるように、区間[0,1]の正規分布を返すようにしようとするととたんにお手上げです。

極限定理を用いれば簡単なのですが遅くなってしまうので、区間[0,1]をはみ出る値が十分無視できる程度の精度でなんとかボックスミューラー法で計算をしたいのです。

数学が弱いので物凄くアホなことを聞いてるのかもしれませんが、どなたか宜しくご教授お願いします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/04/30 20:08:54
  • 終了:--

回答(2件)

id:shampoohat No.1

shampoohat回答回数347ベストアンサー獲得回数02005/04/30 22:25:05

ポイント25pt

「正規分布に従う乱数」であれば、[0,1]をはみ出ないのはありえないので、Cで言えば


double random_wrap() {

doble n;

while( (n=randomN(最小,最大))<0 || n>1 ) {

n=randomN(最小,最大);

}

return n;

}


みたいに、「大凶ならもういちどおみくじを引きなおす」形にしてしまうのが、ad hoc ですが無難かと。

id:vas-animatum

ありがとうございます。

やっぱり、適当な部分で切るしか方法がないですよね。

平均0、分散1だと、プラマイ4あたりで切って正規化するのが吉でしょうか。

2005/05/01 18:08:59
id:ichibatomo No.2

ichibatomo回答回数2ベストアンサー獲得回数02005/05/01 13:33:23

ポイント25pt

web上では”Non-Uniform Random Variate Generation”, の著者Luc Devroye(1986)が原稿を載せていて, chapter_five.pdf のp235(30 of 40)にご存知のBox-Muller法と関連する生成方法の説明があります.


お尋ねの問題は区間[最小, 最大]を台(support)に持つ1次元のtruncated normalに従う(準)乱数の生成ということでしょうか. 同じくダウンロードできるchapter_two.pdfのp39(13 of 56)の問題10にtruncated distributionの一般的な生成方法の説明があります. この場合,裾確率での誤差を小さくするには正規分布の累積分布関数の逆関数の近似を良くしなければいけないでしょう. この方法はBox-Muller 法とは異なります. Box-Muller法をすこし変更してtruncated normalを発生できるかどうかは自明ではないと思いますが,じっくり考えるとできるのかもしれません.


計算を速くすることに主眼を置くならば, truncated normalをbeta分布で近似すればよいかもしれませんが,アイデアだけで近似の精度など計算していないので不確かです.


もし問題が多次元でのことであって, 区間[最小,最大] x ... x [最小, 最大]をsupportにもつk次元のtruncated normalに従う準乱数の発生となると, 問題が込み入ってきますね. 安易な考えはacceptance-rejection samplingの考えに従ってサンプリングするのでしょうか. それはおっしゃっている「極限定理を用いれば簡単なのですが遅くなってしまうので」ということでしょうか. 同じページからはchapter_four.pdfに若干の説明があるようです.

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません