三角分布に従う乱数を発生させるプログラム
最頻値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は入力で与えるものとします)
No.2ベストアンサー
- 回答日時:
最頻値がgで[a, b]の範囲で三角分布に従う乱数を発生させたいとします。
まず、確率密度関数を求めると、
(-∞, 0] : 0
(a, g] : 2(x-a)/{(g-a)(b-a)}
(g, b] : 2(x-b)/{(g-b)(b-a)}
(b, ∞) : 0
分布関数は確率密度関数を積分して、
(-∞, 0] : 0
(a, g] : (x-a)^2/{(g-a)(b-a)}
(g, b] : (g-a)/(b-a)+(x^2-2bx-g^2+2bg)/{(g-b)(b-a)}
(b, ∞) : 1
分布関数の逆関数を求めると、
(-∞, 0] : a
(0, (g-a)/(b-a)] : a+sqrt((g-a)(b-a)x)
((g-a)/(b-a), 1] : b-sqrt((b-g)^2-(b-g)(b-a)(x-(g-a)/(b-a)))
(1, ∞) : b
となりますので、xは0以上1以下の値が入っているとすれば、
if (x <= (g-a)/(b-a)) return a+sqrt((g-a)(b-a)x);
else return b-sqrt((b-g)^2-(b-g)(b-a)(x-(g-a)/(b-a)));
とでも書けばいいでしょう。
(実際に書く場合は、もう少し計算量が少なくなるように書くとは思いますが)
計算があっているかどうかは確認しておいてください。
分かりやすい回答をどうもありがとうございました。
おかげでちゃんと実行することができました。
私のはそもそも積分が間違っていたようです。
詳しい解説、本当にありがとうございました。
No.3
- 回答日時:
ANo.2
思いっきり間違いました。
こちらが正しいです。
if (x <= (g-a)/(b-a)) return a+sqrt((g-a)*(b-a)*x);
else return b-sqrt((b-g)*(b-g)-(b-g)*(b-a)*(x-(g-a)/(b-a)));
No.1
- 回答日時:
言語は何を使われているのかわかりませんが、if文等で条件分岐をするのは駄目なのでしょうか?
> また、初歩的な質問なのですが、区間[0, 1]の一様乱数というのはどう記述すればよいですか?
rand関数というような関数がありませんか?
名前は違うかもしれませんが、必ず乱数を発生させる関数があるはずです。
ひょっとして、0からnまでの整数の乱数は得られるけど、[0, 1]の一様乱数をどうやって得るのかわからないということでしょうか?
(C言語なら(double)rand() / RAND_MAXとでもすればいいですが)
回答ありがとうございます。
言語はC++です。乱数わかりました。
if文等で条件分岐をするというのは
どういう条件のときにどういう動作をすればよいのかが難しいです・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
信頼区間の1.96や1.65ってどこ...
-
2÷3などの余りについて
-
エクセルで可視セルにのみ値貼...
-
マイナスからプラスへ転じた時...
-
Aの値からBの値を除するとは??
-
エクセルの問題です。絶対値の...
-
EXCELの分散分析表のP-値が....
-
一次関数についてです。 y=5な...
-
エクセルのオートフィル?ドラ...
-
2番以降って2番も含まれますか...
-
「Aに対するBの割合」と「Aに対...
-
数学のデータの相関の散布図で...
-
この極限値
-
10%引いた元の数字を出すには?
-
二次関数と関数の違いは何ですか?
-
20'(角度)の計算がわかりま...
-
分散の計算
-
数学 確率変数Xは、X=2またはX...
-
ニューラルネットワークの重み...
-
数学で逆三角関数の勉強をして...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
2÷3などの余りについて
-
マイナスからプラスへ転じた時...
-
信頼区間の1.96や1.65ってどこ...
-
「Aに対するBの割合」と「Aに対...
-
Aの値からBの値を除するとは??
-
ある商品のロス率を5%見込み、...
-
20'(角度)の計算がわかりま...
-
エクセルで可視セルにのみ値貼...
-
値差の%計算方法について
-
二次関数と関数の違いは何ですか?
-
変数とパラメータとは違うもの...
-
EXCELの分散分析表のP-値が....
-
エクセルの問題です。絶対値の...
-
エクセルのオートフィル?ドラ...
-
数学のデータの相関の散布図で...
-
数学 確率変数Xは、X=2またはX...
-
2番以降って2番も含まれますか...
-
10%引いた元の数字を出すには?
-
シグマを平均値で割る
-
Excelで1つしかない値だけを抽...
おすすめ情報