質問: ### 0~9のくじ全てを引くために必要な試行回数を求めるプログラミング C言語で、0~9のくじがあるとき、久慈は何回でも引けるとし、それぞれの数字が出る確率はすべて等しいものとする。すべての数字を引くまでに何回くじを引けばよいか。という問題に関してです。 rand関数を用いるという点は分かるのですがそれをどのように適用するのかが分かりません。 シャープinclude シャープinclude シャープinclude int main(void){ int a,i,kuji[9]; srand((unsigned) time(NULL)); for(i=0; i<9; i++){ kuji[i]=0; } for(i=0; i<10; i++){ a=(int)(rand()/(RAND_MAX+1.0)*9); kuji[a]=0 } ここまででくじを作ったつもりなのですがこの先が全く手を付けられません。 分かる人がいらっしゃいましたらご回答お願いいたします。
回答: > > int a,i,kuji[9]; > > > 0~9の10種類なので,Kuji[9]ではきっと足りないのではないかと見えます. どんな方法だろうが,10種類のそれぞれを引いたかどうかを覚えておく変数さえ用意すれば, * くじを引く * くじを引いた回数を+1する. * 引いた種類に関して,「その種類を引いた」ことを覚える * 全てのくじを引いたなら終了 というのを繰り返せばよいように思います. 終了までに何回くじ引きを繰り返すのか?は未知なので, > > for(i=0; i<10; i++) > > > といった,「一定回数だけ」ループさせるようなやり方ではダメでしょう. while的なのを使って書くと良いかと思います. ``` //0から9のどれかを返す int Kuji() { //※この実装は,すげーてきとーです. //「それぞれの数字が出る確率はすべて等しいものとする」に関して頑張った処理を実装されたい. return (rand()>>2) % 10; } int main() { unsigned short Flags = 0; //各値のくじを引いたかどうかを下位10bitを使って覚える用の変数 unsigned int N = 0; //くじを引いた回数カウンタ srand( (unsigned)time(NULL) ); do { ++N; Flags |= ( 1 << Kuji() ); } while( Flags != 0x3FF ); //10種全てのくじを引いたら終了 printf( "N = %u\n", N ); //くじを引いた回数を表示 return 0; } ```