• ベストアンサー

初心者の作ったプログラムの問題点を指摘ください。

下のように、0から9までの乱数の発生回数の標準偏差を求めるプログラムを組んでみたのですが、最後のシグマの演算が無視されてしまい、0.000000と出力されてしまいます。どこがいけないのでしょうか? #include<stdio.h> #include<time.h> #include<stdlib.h> #include<math.h> int main (void){ int N,i,j,r,a[10]={0,0,0,0,0,0,0,0,0,0}; double S=0; printf("How many trials?;"); scanf("%d",&N); srand((unsigned)time(NULL)); /*初期化*/ for(i=0;i<N;i=i+1) { r=(int)(rand()/(RAND_MAX +1.0)*10); /*乱数N個取得*/ a[r]=a[r]+1; } for(r=0;r<10;r=r+1){ printf("a[%d]=%d.\n",r,a[r]); S=1/10*(S+sqrt((a[r]-N/10)*(a[r]-N/10)));  /*演算(無視されてしまう・・・)*/ } printf("Sigma=%f",&S); return 0; }

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

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★アドバイス >printf("Sigma=%f",&S);  ↑  printf( "Sigma = %.20f\n", S );  としてみて下さい。小数点以下の精度を 20 桁に指定しています。 ・あと >S=1/10*(S+sqrt((a[r]-N/10)*(a[r]-N/10)));  ↑  S=(S+sqrt((a[r]-N/10)*(a[r]-N/10))) / 10.0;  1/10 に掛け算するよりも最後に 10.0 で割るようにした方が良い。  また、10 では整数定数ですので 10.0 とか小数点を付けます。  なお、最初が double 型なら最後(右側)の定数は自動的に double 型になります。    例:  double = a, b = 123.456;    a = 10 * b; ←b が 10 の定数(int 型)として計算されます。  a = b * 10; ←b が double 型なので 10 の定数も double 型として計算されます。 ・以上。

koko9i
質問者

お礼

初めて知りました。 なるほど。型は出てくる順番でも変わるんですか。 回答ありがとうございます。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

#1の回答に加えて、 printf("Sigma=%f",&S); で、&S の & が不要です。

koko9i
質問者

お礼

そうでした。また凡ミスしてしまった・・・ ご指摘感謝します。

すると、全ての回答が全文表示されます。
  • phoenix343
  • ベストアンサー率15% (296/1946)
回答No.2

◇for分の増分はi++;とかにしましょう. ◇配列の初期化はa[10]={0};でもコンパイルできるぞ. ◇最後の結果がdoubleなら,int型を使うのはやめましょう.int型は小数点はつかないの,分かるよね?配列のインデックスぐらいですな. ざっと見た感じ,そんな印象だ. がんばれ.

koko9i
質問者

お礼

型のことをすっかり忘れていました。 とろくさい質問に真摯にお答えいただきありがとうございます。 もう少しがんばりますww

すると、全ての回答が全文表示されます。
  • magiclove
  • ベストアンサー率31% (5/16)
回答No.1

無視されているのではなく、おそらく1/10が整数で計算されて0になってしまっているんだと思います。

koko9i
質問者

お礼

型の事をすっかりわすれていましたw。 4の回答と共にありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A