- ベストアンサー
合同式法をつかって(CPad)
合同式法をつかって(CPad) (1)一様乱数(平均1、分散1) (2)正規乱数(平均1、分散4)のヒストグラムを作成したいのですが、 どのようにしてすればよいのでしょうか? ちなみに乱数のプログラムは作成しました。 よろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
0~1の一様乱数ができたのだから、それから計算してα~βの一様乱数に変換すればいいのです。 ヒント ・0~Aの一様乱数にするには、 A * drnd() ・B~B+1の一様乱数にするには、 B + drnd() これでもわからないようなら、プログラムの本でも買ってきて熟読してください。 おそらくゲーム用の本には乱数のことも詳しく載ってるはずです。
その他の回答 (3)
- kmee
- ベストアンサー率55% (1857/3366)
> ちなみに乱数のプログラムは作成しました とあったので、[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自体は言語ではなく、開発環境です。 今後は使用している言語に合せたカテゴリーを使うことをお勧めします。
お礼
何回もすみません。 このプログラムでは α=1-√(3) β=1+√(3) をどこにしようしたらよいのでしょうか?
- kmee
- ベストアンサー率55% (1857/3366)
β≧αとする 平均から (β+α)/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)
お礼
あいがとうございます。 もうひとつ疑問が浮かんだのですが 以下のプログラムだと範囲が(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)
わからないのはどこですか? ・一様乱数の発生方法 ・正規乱数の発生方法 ・ヒストグラムの作り方 一様分布の平均、分散の公式に条件(平均1、分散1)をあてはめれば、発生させる一様乱数の範囲が求まります。 [0,1)の一様乱数からN(0,1)の正規乱数を作る式があります。 それぞれの方法で規定回数乱数を発生させ、その区間毎の個数を数えるとヒストグラムになります
お礼
返答ありがとうございます。 一様分布の平均、分散の公式に条件(平均1、分散1)をあてはめれるとαもβも2つずつでてきてどちらを採用すればよいかわからないんですよ。
お礼
ありがとうございます。 よくわからないので本でも買って読んでみますね。