• ベストアンサー

合同式法をつかって(CPad)

合同式法をつかって(CPad) (1)一様乱数(平均1、分散1) (2)正規乱数(平均1、分散4)のヒストグラムを作成したいのですが、 どのようにしてすればよいのでしょうか? ちなみに乱数のプログラムは作成しました。 よろしくお願いいたします。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

0~1の一様乱数ができたのだから、それから計算してα~βの一様乱数に変換すればいいのです。 ヒント ・0~Aの一様乱数にするには、 A * drnd() ・B~B+1の一様乱数にするには、 B + drnd() これでもわからないようなら、プログラムの本でも買ってきて熟読してください。 おそらくゲーム用の本には乱数のことも詳しく載ってるはずです。

gun0926
質問者

お礼

ありがとうございます。 よくわからないので本でも買って読んでみますね。

その他の回答 (3)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

> ちなみに乱数のプログラムは作成しました とあったので、[0,1)の一様乱数くらいにはなっているのだと思ってました。 合同法で x = (x * a + b) % m ; (C言語表記) としたときに、 0≦x<m になります。m>0より、各辺をmで割れば 0≦X(=x/m)<1 となります。 実際の場面でも、xをそのまま使うことは少なく、mで割った X を基に、欲しい範囲の乱数に加工します。 整数同士の割り算は整数に切り捨てられるため、doubleにキャストします。 #include <stdio.h> unsigned rndnum=1;/*乱数の初期値*/ unsigned irnd(void); unsigned drnd(void); /*実数版*/ void main(void) { int j; for (j=0;j<10000;j++) { printf("%8.6f \n",drnd()); } } unsigned irnd(void) { rndnum=(rndnum*48828125+0) % 2147483648; Return rndnum; } double drnd(void) { return (double(irnd()) / 2147483648.0 ; } それから、CPadって、これですよね? http://hp.vector.co.jp/authors/VA017148/pages/cpad.html CPad自体は言語ではなく、開発環境です。 今後は使用している言語に合せたカテゴリーを使うことをお勧めします。

gun0926
質問者

お礼

何回もすみません。 このプログラムでは α=1-√(3) β=1+√(3) をどこにしようしたらよいのでしょうか?

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

β≧αとする 平均から (β+α)/2=1 β=2-α 分散から (β-α)^2/12=1^2 (2-α-α)^2=12 4(α-1)^2=12 (α-1)^2=3 (α-1)=±√(3) α=1±√(3) ..(1) β=2-(1±√(3)) β=1?√(3) ...(2) β≧αより α=1-√(3) β=1+√(3)

gun0926
質問者

お礼

あいがとうございます。 もうひとつ疑問が浮かんだのですが 以下のプログラムだと範囲が(0<x>1)となりますよね。 これはどのようにして改善すればよろしいのでしょうか? #include <stdio.h> unsigned rndnum=1;/*乱数の初期値*/ unsigned irnd(void); void main(void) { int j; for (j=0;j<10000;j++) { printf("%8d \n",irnd()); } } unsigned irnd(void) { rndnum=(rndnum*48828125+0) % 2147483648; return rndnum; }

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

わからないのはどこですか? ・一様乱数の発生方法 ・正規乱数の発生方法 ・ヒストグラムの作り方 一様分布の平均、分散の公式に条件(平均1、分散1)をあてはめれば、発生させる一様乱数の範囲が求まります。 [0,1)の一様乱数からN(0,1)の正規乱数を作る式があります。 それぞれの方法で規定回数乱数を発生させ、その区間毎の個数を数えるとヒストグラムになります

gun0926
質問者

お礼

返答ありがとうございます。 一様分布の平均、分散の公式に条件(平均1、分散1)をあてはめれるとαもβも2つずつでてきてどちらを採用すればよいかわからないんですよ。

関連するQ&A

  • 確率統計 プログラム

    (1) 正規乱数の発生–中心極限定理の利用  中心極限定理を利用して,区間[0, 1) の一様乱数から標準正規分布N(0, 1) に従う正 規乱数を100,000 個発生し,そのデータから得られる以下の各項目を報告しなさい. ここでは,一様乱数の生成は合同式法を用い,また,正規乱数の生成は中心極限定 理を利用して,いずれも自分で作成したC 言語プログラムで実現すること.(既存の RAND 関数などを用いない) 1. 100,000 個の正規乱数の平均値.なお,理論値は0 である. 2. 100,000 個の正規乱数の標準偏差.なお,理論値は1 である. 3. 100,000 個の正規乱数のヒストグラム(頻度分布).ただしここでのヒストグラ ムは,区間[−5, 5] を100 分割したものとする. 4. 100,000 個の正規乱数のヒストグラム.ただしここでのヒストグラムは,区間 [2.5, 5] を25 分割したものとする.これは,前項3 の右端部を取り出したもので ある. 5. 正規乱数を発生して上項1 ∼ 4 を求めるために作成した,プログラムのソース. (2) 正規乱数の発生–Box-Muller 法  ボックス・ミュラー法により,区間[0, 1) の一様乱数から標準正規分布N(0, 1) に従う 正規乱数を100,000 個発生し,そのデータから得られる以下の各項目を報告しなさい. ここでは,一様乱数の生成は合同式法を用い,また,正規乱数の生成はBox-Muller 法 を用いて,いずれも自分で作成したC言語プログラムで実現すること.(既存のRAND 関数などを用いない) 1. 正規乱数の平均値. 2. 正規乱数の標準偏差. 3. 正規乱数のヒストグラム.区間[−5, 5] を100 分割したものとする. 4. 正規乱数のヒストグラム.区間[2.5, 5] を25 分割したものとする. 5. プログラムのソース. (3) 両者の比較課題1, 2 で得られた結果を比較し,2 つの方法で得られた正規乱数の性質 に違いが見い出されれば,それを考察しなさい. 何ですけどお願いいたします 期限は2009/7/27

  • プログラムを教えてください!

    レポートの質問です。 以下の問題のプログラムを作らなければいけないのですが、いろいろと調べてみてもまったくわかりません。 わかる方プログラム教えてください! 課題1 合同式法を用いて,区間[0,1] (区間[0,1)でも良い) の 一様乱数を100 万個生成し,以下を報告せよ.ただし,一様乱数の生成にはC 言語で自作したプログラムを用いること. (1a) 平均の数値計算結果 (1b) 標準偏差の数値計算結果 (1c) 一様乱数のヒストグラム.ヒストグラムは区間[0,1] を100 分割して 作成すること. 課題2 中心極限定理に基づく「間便法」を用いて,区間[0,1] (区 間[0,1)でも良い) の一様乱数から標準正規分布N(0,1)に従う正規乱数を100 万 個生成し,以下を報告せよ.ただし,正規乱数の生成にはC言語で自作したプ ログラムを用いること. (2a) 平均の数値計算結果 (2b) 標準偏差の数値計算結果 (2c) 正規乱数のヒストグラム.ヒストグラムは区間[-5, 5] を100 分割して 作成すること.

  • Rにおいて、中心極限定理を確認するために、乱数の標本平均のヒストグラム

    Rにおいて、中心極限定理を確認するために、乱数の標本平均のヒストグラムと正規分布のグラフを重ね合わせたいのですが、軸ラベルがおかしくなってしまいます。例えば、1000個の標本平均のヒストグラム hist(x)と平均0,分散1の正規分布のグラフを上手く重ね合わせるにはどうしたらいいですか?

  • C++言語について

    大学で研究室に配属された友達に勉強の相談をされました。 下の課題なのですが、どのようにプログラムすれば良いのでしょうか? 来年は、留年している僕の番なのでとても気になります。 丸投げで申し訳ないのですが、どなたかよろしくお願いいたします。 (1) 0から20の間の一様乱数を1000個作り、それをヒストグラムにする。 出来上がった分布の平均が10、分散が20÷√12になることを確認する。 (2) 平均値が10の指数関数分布exp(-ax)(0<x)になるように乱数を1000個作り、それをヒストグラムにする。 出来上がった分布の平均値が10に近いことを確認する。 (3) 平均値が5のpoisson分布になるように乱数を1000個作り、それをヒストグラムにする。 そのヒストグラムをpoisson分布関数、及びgauss分布でfitする。 (4) 平均値が10の指数関数分布exp(-ax)(0<x)になるように乱数からサンプルを1000個選び出し、その和を取りヒストグラムにする。 この操作を10000回繰り返す。 出来たヒストグラムをgauss分布関数でfitする。 僕にはもうサッパリ分かりません。。。

  • 多次元正規乱数が正しく生成されているか確認するには?

    多次元正規乱数に従うサンプルを生成したく,以下の資料を参考にし,プログラムを作成しました。生成したサンプルが本当に要求した多次元正規乱数にしたがっているか確認したいのですが,以下の手順で正しいといえるでしょうか? 例: 平均μ=[1; 2] 分散協分散行列 Σ=[1,0;    0,1]; に従う多次元正規乱数y=[y1,y2]を全部でn=100サンプル生成した. このとき,n=100個のy1の平均が1,n=100個のy2の平均が2となり, n=100個のy1の分散が1,n=100個のy2の分散が1,y1とy2の共分散が0となれば正しく生成できているといってよいでしょうか? この方法で確認したのですが,生成したサンプルが元の平均,共分散から0.1~0.2のずれがあり正しいのか不安です。 参考にした資料: 「多次元正規乱数の作成法」 http://ci.nii.ac.jp/naid/110001186428/ja 「共分散の計算の仕方」 http://www.ge.fukui-nct.ac.jp/~nagamizu/f-3-s.pdf

  • ヒストグラム平滑化について

    MATLABで画像のヒストグラム平滑化処理プログラムを作成しました。ヒストグラムは確かに処理前と比べて平滑化され、私としては良かったんですが、友人に完全に一律に平均化されていないがそれで良いのかと言われ、不安になりました。色々調べてみましたが、どの平滑化処理でも完全に平均化されてはいなかったんですが、ヒストグラムの平滑化処理において正規分布に沿っている等、何かあるのでしょうか?完全に平均化してしまうと元の画像を損なってしまう気がするのですが…ご意見の程よろしくお願いします。

  • 正規分布の発生の仕方

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

  • ヒストグラムのプログラム

    乱数で入力されたテキストファイル読み込んでヒストグラムを出力するCプログラムが分かりません。 現在、乱数のテキストファイル作成まで出来ました。 ぜひ教えてください。よろしくお願いします。

  • 標準正規分布の乱数

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

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

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

専門家に質問してみよう