teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

わかりやすく追記

2021/12/27 13:25

投稿

ak.n
ak.n

スコア305

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

誤記を修正

2021/12/27 13:25

投稿

ak.n
ak.n

スコア305

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

誤記を修正しました

2021/12/27 13:20

投稿

ak.n
ak.n

スコア305

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

参照先追加

2021/12/27 13:19

投稿

ak.n
ak.n

スコア305

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;