###問題点
0〜6の乱数を生成して6段階のおみくじを出力するプログラムを作成しています。srand(time(NULL))で乱数のシードを設定しているのですが毎回出力が6になってしまいます。srandが機能していないのはわかるのですがどう改善すればいいのか教えていただきたいです。
###該当コード
C
1//おみくじ 2 3#include <time.h> 4#include <stdlib.h> 5#include <stdio.h> 6#include <string.h> 7 8int Omikuji(void); //プロトタイプ宣言 9 10int main(void) 11{ 12 Omikuji(); 13 return 0; 14} 15 16int Omikuji(void) 17{ 18 int num; //乱数 19 char luck[20]; //吉凶 20 srand(time(NULL)); //乱数のシード 21 num = rand() % 7; //乱数生成 22 23 switch (num) 24 { 25 case 0: 26 strcpy(luck, "大吉"); 27 break; 28 case 1: 29 strcpy(luck, "中吉"); 30 break; 31 case 2: 32 strcpy(luck, "小吉"); 33 break; 34 case 3: 35 strcpy(luck, "吉"); 36 break; 37 case 4: 38 strcpy(luck, "末吉"); 39 break; 40 case 5: 41 strcpy(luck, "凶"); 42 break; 43 case 6: 44 strcpy(luck, "大凶"); 45 break; 46 } 47 48 printf("%d あなたの吉凶は:%s\n", num, luck); //結果の表示 49 50 return 0; 51} 52
###実行結果
6 あなたの吉凶は:大凶
実行結果をどうやって確認しましたか?
提示のコードをそのままコンパイルし、1秒以上の間隔をあけて実行したら、そのたびに違う結果が出ましたよ。
code runnerで実行をしました。すいません。実行結果を掲載し忘れていました。
1秒以上の時間をあけて実行しましたか?
time(NULL)の値は秒単位なので、1秒以上たたないと同じ値になります。
はい空けています。乱数生成の簡単なプログラムを作ってみたのですが、そちらですと毎回ちがう乱数が生成されます。
不思議ですね。
timeの返値を確認してみては。
time_t t;
t = time(NULL);
srand(t);
printf("%ld %d あなたの吉凶は:%s\n", t, num, luck);
なぜかrand() % 5や6にすると違う乱数が生成されるのに7した途端6だけしか生成されません。不思議です。
1640600587 6 あなたの吉凶は:大凶
1640600589 6 あなたの吉凶は:大凶
1640600593 6 あなたの吉凶は:大凶
確かにシードは違うのに6しか生成されていないみたいですね
提示のコードにおかしなところは無いし、それを私の環境で実行してもそのような不思議なことは起こらなかったし、そちらの環境(コンパイラやライブラリ)がおかしいというのも考えにくいので、1つ考えられるのは、本当は提示のコードとは違うコードをコンパイルした結果を実行してしまっているのでは?ということです。そのへんを重点的に確認してみてください。
おかしいですね。時間は確かに違いますし%6や%8にした瞬間に乱数が変わってきます。%7にした瞬間に6しか生成されないです。一回時間をおいてみます。
・まず、真っ先にやることは、 time(NULL) の値が毎回変わっているか、確かめる。
time_t t = time(NULL);
printf("%ld\n", t);
・次に、srand の引数が、正しく引き渡されているのかどうか・・
srand((unsigned)time(NULL))
としてみたらどうなる? 32bit と 64bit で違うとかあるようです。
時々、不思議な現象に遭遇しますが、必ず原因があります。
乱数なのですから、同じ値が何度出ても不思議では無いとも言えます。
これ試してみては?
https://teratail.com/questions/221781#reply-324973
(つまり一回 rand()を空実行する)
ありがとうございます。
rand() の素の値は、毎回異なりますか?
もし rand()の値は異なるのに rand() % 7 した結果が同じということであれば、rand() はシード値により値を変えているが 7 で割った余りが一致するような乱数が出力されている、としか考えられません。rand()の実装によっては、あり得ることですが、当方でコンパイルしてもそうはなりません・・・なんでしょうかね。
回答3件
あなたの回答
tips
プレビュー