- ベストアンサー
Cプログラミングで正規乱数を発生させる方法
- Cプログラミングで正規乱数を発生させたいのですが、どこがおかしいのでしょうか?
- Cプログラム内のファイル操作に関するエラーが発生しているのかもしれません。
- 正規乱数生成の数式が正しく実装されていない可能性があります。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>for(i=0;i<n;i++) まず、前回答者さんも御指摘ですが、変数nが初期化されていませので無限ループかメモリ破壊 を起こす可能性が有ります。 >fscanf(fp1,"%lf",&x1); fですのでDoubleに変換しますので、x1もx2も破壊されます。 倍精度浮動小数点ですのでスタック上の変数が破壊されます。 CPUによって異なりますが、8バイト以上だと思いますので スタックを壊して変換します。 従いましてDouble x1、x2宣言が良いのでは? >y1=sqrt(2)*sqrt(-2*log(x1))*cos(2*PI*x2); ここでもcastしないと桁落ちするかも。 >fprintf(fp2,"%lf\n",y1); このfの前は”いち”ですか?”エル”ですか? ”エル”なら”%lf”でDoubleでokですが、”いち”なら 1桁だけの表示になります。
その他の回答 (5)
- Tacosan
- ベストアンサー率23% (3656/15482)
なんで x1 や x2 を unsigned int にしたの? Box-Muller 法は完全に理解できている?
- D-Matsu
- ベストアンサー率45% (1080/2394)
「エラーがある」だけではなく「どんなエラーが」「どこで」出るかも書きましょう。 コンパイルエラーならエラーメッセージ本体と出ている行、実行時エラーならデバッガなどで出る箇所を特定しておくと回答側も追跡がかなり楽になります。 今のコードですぐに気付く分としては、nが不定値(初期化されていない)なので何回forが回るかは全く未定義です。 nをx1, x2の数で初期化すれば動作すると思いますが、そもそも読み終わり判定ならfeof()とwhileの組み合わせの方が確実です。
- Tacosan
- ベストアンサー率23% (3656/15482)
なんというか, Box-Muller 法をいろいろと勘違いしているように見える. 求める正規乱数の平均と分散はそれぞれどのような値にしたい?
- D-Matsu
- ベストアンサー率45% (1080/2394)
#1でも言われてますが、scanf系の%lfはdoubleに対応しますがx1, x2の型はunsigned intになっていて不整合が起きています。 また、sizeof(double) > sizeof(unsigned int)の環境下では正しく値が取れないのみならず、メモリ破壊により予期せぬバグの原因となるかsegmentation faultの原因になります。 x1, x2の型が正しいのならunsigned intに対応する%uで取らなければならないし、型が間違っているのなら正しくdoubleで宣言しなければなりません。
お礼
ありがとうございます。 #include <stdio.h> #include<stdlib.h> #include<math.h> #define PI 3.141592653589793238 int main (void) { FILE *fp1,*fp2; int i,n; unsigned int x1,x2; double y1,y2; fp1=fopen("ransu.txt","r"); fp2=fopen("seikiransu.txt","w"); for(i=0;i<n;i++) { fscanf(fp1,"%u",&x1); fscanf(fp1,"%u",&x2); y1=sqrt(2)*sqrt(-2*log(x1))*cos(2*PI*x2); fprintf(fp2,"%lf\n",y1); } fclose(fp1); fclose(fp2); return 0; } 上記のように変更したところまだエラーがあるようです。 ほかになにが問題点はあるのでしょうか?
- Wr5
- ベストアンサー率53% (2173/4061)
>unsigned int x1,x2; >fscanf(fp1,"%lf",&x1); >fscanf(fp1,"%lf",&x2); 型が合っていないように見えますが?
お礼
平均0、分散2にしたいです