C言語 プログラミングに関する質問です。
0~9までの番号が振られたくじがあり、出る確率はすべて等しいものとするとくじ10本をすべて引き切るまでに何回くじを引く必要があるか求め、そのシュミレーションを1000000回行った時の回数の合計と平均値を求めよ。ただしくじは何度でも引けるものとし、rand関数を用いることとする。
という問いに関してなのですが、以下のプログラムを実行すると合計が18億前後、平均は1800ほどになってしまい、本来平均20~40ほどとなるはずなのに大きくずれが生じてしまいます。個人的に不安なのが変数を宣言する位置とそもそもdo文をこのような形でfor文に取り込むことが出来るかという点、また1000000回シュミレーションしたときの合計(sum)を求めるところです。
まだプログラミングを始めて間もなく、わからないことばかりなので教えていただけると幸いです。。。
よろしくお願いします。
#include<stdio.h> #include<time.h> #include<stdlib.h> /*0~9の数字を返す*/ int kuji(){ return (rand()>>2) % 10; } int main(){ int i; double avg=0; /*1000000回試行したときの平均値*/ unsigned short Flags = 0; /*各値のくじを引いたか下位10ビットで記憶する変数*/ unsigned int N = 0; /*くじを引いた回数カウンター*/ unsigned sum=0; /*1000000回引いた時の回数の合計*/ /*for文にdo文を入れdo文を1000000回繰り返す*/ for(i=0; i<1000000; i++){ sum += N; /*1000000回分のNの合計*/ avg = sum/1000000; /*1000000回引いた時の平均値*/ srand((unsigned) time(NULL)); /*0~9のくじを引き切るまでの回数を求める*/ do{ ++N; Flags |= (1 << kuji() ); }while( Flags != 0x3FF); } printf("sum = %u\n",sum); /*1000000回引いた時の回数の合計を表示*/ printf("avg = %.2f\n", avg ) ;/*1000000回引いた時の平均の回数を表示*/ return 0; }
回答4件
あなたの回答
tips
プレビュー