• 締切済み

Cプログラムです

#include<stdio.h> #include<math.h> int main(void) { double D[512]; short data[16000]; double datafft[512]; double horizon[256]; double dB[256]; double power[256]; double Xr[512],Xi[512]; double w, pai=3.1415926; double er, ei; double r,x,r1,x1,r2,x2 ; int i,k,n,N=500; for(k = 0; k < N; k++) { Xr[k] = 0.0; Xi[k] = 0.0; for(n = 0; n < N; n++) { w = 2 * pai * k * n / N; er = cos(w); ei = sin(-w); r = r1 * r2 - x1 * x2; x = r1 * x2 + r2 * x1; Xr[k] = Xr[k] + er / N; Xi[k] = Xi[k] + ei / N; } } for(i=0;i<512;i++) { datafft[i] = (double)data[i+1000]; power[i] = Xr[i] * Xr[i] + Xi[i] * Xi[i]; } for(i=0;i < 256;i++) { horizon[i] = 16000.0 * ((double)i /512); dB[i] = 10 * log10(power[i]); printf("%f %f \n", horizon[i], dB[i]); } } 正規乱数を発生させたいんですけど、変な値が出てしまいます。 正しくはどうすれば良いか教えてもらえませんか?

みんなの回答

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

「変な値」になるのは ・そもそも正規乱数発生用のプログラムではない  高速フーリエ変換のプログラムっぽく見えますが、実際には(Σsin(ω)/N)^2+(Σcos(-ω)/N)^2 を計算しているだけです。 ・値を代入していないのに、変数の値を参照している。  C言語では、変数や配列を宣言しただけでは、その値は決まっていません。  例えば datafft[i] = (double)data[i+1000]; ですが、配列dataに値が代入されている様子がありません。  よって、どんな値になっているかまったくわかりません。  もっとも、その結果を利用していないので、影響はありませんが。 正規乱数発生方法は、検索すればいくらでも見つかります。 例えば http://ja.wikipedia.org/wiki/%E4%B9%B1%E6%95%B0%E5%88%97#.E6.AD.A3.E8.A6.8F.E4.B9.B1.E6.95.B0

回答No.2

「正規乱数 作成」で検索すれば、いくつもサンプルが見つかる。

参考URL:
http://www.sat.t.u-tokyo.ac.jp/~omi/random_variables_generation.html#Gauss
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

えぇっと.... このプログラムの, いったいどこに「正規乱数を発生させる」ところがあるんでしょうか? そもそも何をしたいのかもさっぱりわからない....

is0205ei
質問者

補足

では、正規乱数発生させたいんですがどのようにすればよいですか?

関連するQ&A

専門家に質問してみよう