前提・実現したいこと
C言語初心者です。
二重のfor文の中でrand()関数を使用して簡単なコードを書いたのですが、乱数の出力が2回目以降から一定の値となってしまいます。。
funcAとfuncBの中では、srand((unsigned int)time(NULL));で乱数の種を再設定して、funcAとfuncBにアクセスした際は毎回、違う値を返すようにしたいです。
該当のソースコード
C言語
1#include <stdio.h> 2#include <stdlib.h> 3#include <time.h> 4 5 6double funcA(int n){ 7 srand((unsigned int)time(NULL)); 8 int r = rand() % n; 9 10 return r; 11} 12 13 14double funcB(int n){ 15 int r; 16 srand((unsigned int)time(NULL)); 17 r = rand() % n; 18 19 return r; 20} 21 22 23int main(){ 24 int i,j; 25 double rnd; 26 int num; 27 double epsilon = 0.05; 28 29 unsigned int seed = 10;//私の都合でここは固定したいです 30 31 /* i試行 */ 32 for(i=1; i<=3; i++){ 33 srand(seed); 34 35 rnd = (double)rand()/(double)RAND_MAX; 36 37 if(epsilon <= rnd){ 38 num = funcA(5); 39 }else{ 40 num = funcB(2); 41 } 42 43 printf("-----------結果-----------\n"); 44 45 printf("%lf\n", rnd); 46 } 47 printf("\n\n"); 48 return 0; 49}
ちなみに、メイン関数の中で定義したseedの値をsrand((unsigned int)time(NULL));にすれば解決なのでしょうが、ここ私の都合上10のままで、funcAとfuncBにアクセスしたときのみ毎回違う値を返すようにしたいです。
実行した結果は
-----------結果----------- 0.002167 -----------結果----------- 0.832820 -----------結果----------- 0.832820 -----------結果----------- 0.832820 -----------結果----------- 0.832820
このようになってしまい、二回目以降の結果が一定になってしまいます。
試したこと
C言語
1 if(epsilon <= rnd){ 2 num = funcA(5); 3 }else{ 4 num = funcB(2); 5 }
この部分をコメントアウトして実行すると、毎回違う値は出力されました。
また、funcAとfuncBの中のsrand((unsigned int)time(NULL));をコメントアウトしても上手くいきました。
しかし、これだと乱数の種が一定なので、funcAとfuncBへの一回目のアクセス時は毎回同じ値になってしまいます。
恐らく、メイン関数でもfuncA、funcBでもsrand関数を使用しているためおかしくなっているのではないかと考えます。
funcAとfuncBへのアクセスで毎回違う値を返すようにするためにはどのようにすればよろしいでしょうか。
お力添えをお願いします。
補足情報(FW/ツールのバージョンなど)
VScode
バージョン: 1.63.2

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/01/30 10:25
2022/01/30 12:15
2022/01/30 16:22