• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Cプログラミングの質問なのですが,)

Cプログラミングで正規乱数を発生させる方法

このQ&Aのポイント
  • Cプログラミングで正規乱数を発生させたいのですが、どこがおかしいのでしょうか?
  • Cプログラム内のファイル操作に関するエラーが発生しているのかもしれません。
  • 正規乱数生成の数式が正しく実装されていない可能性があります。

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

  • ベストアンサー
回答No.5

>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)
回答No.6

なんで x1 や x2 を unsigned int にしたの? Box-Muller 法は完全に理解できている?

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.4

「エラーがある」だけではなく「どんなエラーが」「どこで」出るかも書きましょう。 コンパイルエラーならエラーメッセージ本体と出ている行、実行時エラーならデバッガなどで出る箇所を特定しておくと回答側も追跡がかなり楽になります。 今のコードですぐに気付く分としては、nが不定値(初期化されていない)なので何回forが回るかは全く未定義です。 nをx1, x2の数で初期化すれば動作すると思いますが、そもそも読み終わり判定ならfeof()とwhileの組み合わせの方が確実です。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

なんというか, Box-Muller 法をいろいろと勘違いしているように見える. 求める正規乱数の平均と分散はそれぞれどのような値にしたい?

gun0926
質問者

お礼

平均0、分散2にしたいです

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

#1でも言われてますが、scanf系の%lfはdoubleに対応しますがx1, x2の型はunsigned intになっていて不整合が起きています。 また、sizeof(double) > sizeof(unsigned int)の環境下では正しく値が取れないのみならず、メモリ破壊により予期せぬバグの原因となるかsegmentation faultの原因になります。 x1, x2の型が正しいのならunsigned intに対応する%uで取らなければならないし、型が間違っているのなら正しくdoubleで宣言しなければなりません。

gun0926
質問者

お礼

ありがとうございます。 #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)
回答No.1

>unsigned int x1,x2; >fscanf(fp1,"%lf",&x1); >fscanf(fp1,"%lf",&x2); 型が合っていないように見えますが?

関連するQ&A