回答編集履歴
4
わかりやすく追記
answer
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
「C言語での乱数生成で常に同じ値となってしまうケースがある」でググると出てきます。
|
4
4
|
|
5
|
+
何が起きているかというと、srand() は正しく機能していて、 rand() も毎回異なる値を出してはいるが、「7 で割った余りの値」は、シード値の与え方を time() にしている限り 35.5 時間経たないと、変わらない、です。
|
6
|
+
|
5
7
|
7 のときだけ不具合が出ます。理由はこうです:
|
6
8
|
|
7
9
|
rand() の内部処理で、このような場所があります。
|
3
誤記を修正
answer
CHANGED
@@ -22,6 +22,6 @@
|
|
22
22
|
|
23
23
|
シード値に time(NULL) を指定されているのであれば、
|
24
24
|
シード値が 127773 変わる、つまり 35.5時間後にならないと、
|
25
|
-
7 で割った値が変わりません。
|
25
|
+
7 で割った余りの値が変わりません。
|
26
26
|
|
27
27
|
解決策として、たとえば rand() % 8 して結果 7 のときは、再度 rand() する(while)などして、0~6を取得するとか、なるべく 7 と互いに素な数で余りを出したほうがよさそう。
|
2
誤記を修正しました
answer
CHANGED
@@ -18,7 +18,7 @@
|
|
18
18
|
|
19
19
|
ところが hi は、*ctx が 127773 変化しない限り、値は一定です。
|
20
20
|
|
21
|
-
そのため、7
|
21
|
+
そのため、x % 7 の値はいつまでたっても変わりません。
|
22
22
|
|
23
23
|
シード値に time(NULL) を指定されているのであれば、
|
24
24
|
シード値が 127773 変わる、つまり 35.5時間後にならないと、
|
1
参照先追加
answer
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
一部の環境では、rand() % 7 を使わない方がよさそうです。
|
2
2
|
|
3
|
+
「C言語での乱数生成で常に同じ値となってしまうケースがある」でググると出てきます。
|
4
|
+
|
5
|
+
7 のときだけ不具合が出ます。理由はこうです:
|
6
|
+
|
3
7
|
rand() の内部処理で、このような場所があります。
|
4
8
|
```C
|
5
9
|
hi = *ctx / 127773;
|