三角関数の乱数生成方法について

このQ&Aのポイント
  • 三角関数を利用して、範囲内の乱数を生成する方法について調べています。
  • 具体的には、cos^2(θ)に従う乱数を作成するために、累積分布関数の逆関数を求める必要があります。
  • C++でプログラムを書いていますが、数学の知識が不足しているため、逆関数の求め方についてアドバイスをいただきたいです。
回答を見る
  • ベストアンサー

三角関数の乱数について

シミュレーションで用いる為に、 cos^2(θ) (コサイン2乗θです、θは0~90度の範囲) に従う乱数を作成しなければいけません。 (具体的な内容としましては、θを地表と鉛直方向の角度とすると、入射するN(粒子数)が、cos^2(θ)に比例し、それに沿った粒子を大量に発生させる必要がある為) プログラムはC++で書いています。 自分なりに調べて、 確率密度関数をf(x)としたとき、その累積分布関数g(x)の逆関数、 G(x)=g^-1(x)を求め、G(rand())として得られる、という所まではわかったのですが、 昔から数学が苦手な為、 f(θ)=cos^2(θ) g(θ)=(sin2θ)/4 + θ/2 で、これからG(θ)を求める方法がわかりません。 (これは非線型の逆関数でしょうか?) これだけなら数学の方に書くべきかもしれませんが、 このような三角関数の乱数の求めかたはプログラミングの分野で既に周知かなと思いこちらで質問しました。 どうすればいいかご助言を頂きたいです。 求められるのであれば上記の方法の続きでなくともなんでも構いません。 私はプログラム初心者で、まだ知らない便利な関数があり見落としているかもしれないです。 よろしくお願い致します。

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

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8512/19350)
回答No.1

難しく考え過ぎ。 まず「入射角」と「発生値」の2つの数を乱数により作る。 「入射角」は「0以上90以下」の「角度」を持つ浮動小数点数。 「発生値」は「0以上1以下」の浮動小数点数。 次に、求めた「入射角」より「cos^2θ」の「発生しきい値」を浮動小数点数で求める。 もし「発生値>発生しきい値」の場合、粒子は発生出来ないので、最初から「入射角」と「発生値」を乱数で作り直す。 そうでなければ、粒子は発生出来るので、最初に作成した「入射角」を採用し「作った入射角で入射してくる粒子が発生した」とします。 この処理で「1000個の入射角を生成する」と、その1000個の発生確率は「cos^2θ」に比例しています。

ht4020
質問者

お礼

ご回答ありがとうございます!! 一つのことに気をとられてて多角的に考えれてなかったです・・・。 その方法を使わせて頂きます!! 助かりました。本当にありがとうございました!

関連するQ&A

  • 三角分布に従う乱数

    三角分布に従う乱数を発生させるプログラム 最頻値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つの方法があるというのですが、意味がわかりません。 正規乱数でなんですか。 なぜ12個足して6をひくのですか。 また逆関数法の=NORMSINV(RAND()) てどういう意味ですか。 正規乱数の発生 1 一様乱数を12個足して6を引く方法 =RAND()+RAND()+・・・・+RAND() - 6 12個分 2 逆関数法 =NORMSINV(RAND())

  • 乱数を発生させるプログラムを教えてください。

    タイトルのままなのですが、1から100までの乱数を発生させるプログラムを知りたいです。 乱数をxとおくと、xの値は、0<x<1の範囲内でお願いします。 C言語で、rand関数を用いて、どうかお願いします。

  • こんな条件を満たす乱数生成関数教えてください

    1.任意の周期を指定できる 2.種を指定できる(直前の生成値を引数にとる) 3.逆関数が定義できる 4.生成された乱数 x、y の距離を(定数時間で)求められる   つまり y = f(x) ならxとyの距離は1、 y = f( f( f(x) ) ) なら距離3、というように 乱数としての質(均等に分布していること)はあまり重視しません。 ビット幅は32~128bitくらい(任意ならベスト)であればいいと思っています。 以下のような感じにしたいです。  int rand(x, p);   // 戻り値 y = f(x)、pは周期、xは直前の乱数値  int inv(y, p);   // 戻り値 x = f^-1(y)  int distance(x, y) // y = f(f(x)) のとき、distance(x, y) = 2 で distance(y, x) = -2 一応以下の関数が条件1~4を満たすのですが、残念ながら乱数としての性質が皆無なので使えないです。  int rand(x, p) { return (x+1) % p; }  int inv(y, p) { return y ? y - 1 : p-1; }  int distance(x, y) { return y - x; } よろしくご教授お願いします。

  • 三角関数の定義

    cos, sinと全く同じように 「ピタゴラスの定理と加法定理を満たす関数」、すなわち [f(x)]^2 + [g(x)]^2 = 1 f(x + y) = f(x)f(y) - g(x)g(y) f(x - y) = f(x)f(y) + g(x)g(y) g(x + y) = g(x)f(y) + f(x)g(y) g(x - y) = g(x)f(y) - f(x)g(y) を満たす関数f, gは、 現行のcos, sin以外には存在しないのでしょうか。 すなわち、三角関数を 「上の関係を満たす関数」として定義しても 全ての性質を語り尽くすことができるのでしょうか。 また、「加法定理だけを満たす関数」としては どのようなものが考えられるのでしょうか。

  • 乱数発生の関数。

    確率分布関数が次の表で与えられているとき,この分布に従う乱数を線形補間を使った逆変換によって生成する関数をどうやって作成したらいいか、全くわかりません。線形補間はなんとなくわかるんですが…。どなたか教えてください。 x F(x) 0 0.0024788 1 0.0173513 2 0.0619688 3 0.1512039 4 0.2850565 5 0.4456796 6 0.6063028 7 0.7439798 8 0.8472375 9 0.9160760 10 0.9573791 11 0.9799080 12 0.9911725 13 0.9963715 14 0.9985996 15 0.9994909 16 0.9998251 17 0.9999431 18 0.9999824 19 0.9999948 20 0.9999985 21 0.9999996 22 0.9999999 23 1.0000000

  • 乱数をC言語で

    乱数をC言語でプログラムしたいのですが、 rand関数を使わずに作らなきゃいけないという事なんですが 一度作ってはみたもののうまく乱数にできずに困っています できれば教えていただきたいです

  • 標準正規分布の乱数

    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; }

  • 三角関数の問題で分からないものがあるのですが

    三角関数の問題で分からないものがあるのですが、 次の不等式を解け。ただし、0≦x≦2πとする。 √3sin 2x+2cos^2x<1 (ルート3 サイン2エックス プラス 2コサイン2乗エックス 小なり 1) いろいろと試したのですが、なかなか答えに繋がりません。。。 解き方を教えて下さい。 よろしくお願いします。

  • 三角関数

    関数 f(x)=8√3cos^2x+ 6sinxcosx+2√3sin^2x について (2)f(x)をsin2xとcos2xを 用いて表せ。 (2)0≦x≦πであるとき,関数f(x)の最大値と最小値,およびそのときのxの値を求めよ。 テスト範囲なのですが 授業では解説されなかった問題ですので答えが分かりません。 解説をしていただけないでしょうか?

専門家に質問してみよう