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

回答編集履歴

2

追記

2020/05/16 17:43

投稿

cateye
cateye

スコア6851

answer CHANGED
@@ -52,4 +52,5 @@
52
52
  clang version 10.0.0 (trunk 375507)
53
53
  Target: x86_64-unknown-linux-gnu
54
54
  Thread model: posix
55
- InstalledDir: /usr/local/bin
55
+ InstalledDir: /usr/local/bin
56
+ 参考:[なぜ乱数ジェネレーターを使用しているときにモジュロバイアスがあると人々が言うのですか?](https://www.it-swarm.dev/ja/c++/%E3%81%AA%E3%81%9C%E4%B9%B1%E6%95%B0%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%AC%E3%83%BC%E3%82%BF%E3%83%BC%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AB%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%AD%E3%83%90%E3%82%A4%E3%82%A2%E3%82%B9%E3%81%8C%E3%81%82%E3%82%8B%E3%81%A8%E4%BA%BA%E3%80%85%E3%81%8C%E8%A8%80%E3%81%86%E3%81%AE%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F/1066683422/)

1

ソース追記

2020/05/16 17:43

投稿

cateye
cateye

スコア6851

answer CHANGED
@@ -1,4 +1,55 @@
1
1
  > rand()%3;
2
2
 
3
3
  の場合は、rand()の発生する乱数を3で割ったあまり(つまり、0〜2)を使いたいからでしょう。
4
- 例えば、rand()%10とすれば0〜9が得られます。
4
+ 例えば、rand()%10とすれば0〜9が得られます。
5
+
6
+ 試しに、通常のrand()関数とmt19937を使ったテストをしてみました。
7
+ ```cpp
8
+ #include <iostream>
9
+ #include <cstdlib>
10
+ #include <random>
11
+ //
12
+ using std::cout;
13
+ using std::endl;
14
+ //
15
+ const int R_MAX = 1000;
16
+
17
+ int main(void)
18
+ {
19
+ int rr[4] = {0};
20
+ int mr[4] = {0};
21
+
22
+ for(int i = 0; i < R_MAX; ++i) {
23
+ rr[rand( ) % 3]++;
24
+ }
25
+ //
26
+ std::mt19937 mt(std::random_device{ }( ));
27
+ std::uniform_int_distribution<int> dist(0, 2);
28
+
29
+ for(int i = 0; i < R_MAX; ++i) {
30
+ mr[dist(mt)]++;
31
+ }
32
+ //
33
+ for(int i = 0; i < 4; ++i) {
34
+ cout << i << ": " << rr[i] << " " << mr[i] << endl;
35
+ }
36
+ return 0;
37
+ }
38
+ ```
39
+ 結果は。以下のように成りました。(同一数値が連続する等の)発生状況は未検証ですが、1000回の試行での数値の発生件数に付いては、ほとんど差異はないように思います。
40
+
41
+ ```text
42
+ usr ~/Project/test % ./a.out
43
+ 0: 354 319
44
+ 1: 305 345
45
+ 2: 341 336
46
+ 3: 0 0
47
+ ```
48
+ 環境は以下
49
+ usr ~/Project/test % uname -a
50
+ Linux usr.Mint193 5.3.0-51-generic #44~18.04.2-Ubuntu SMP Thu Apr 23 14:27:18 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
51
+ usr ~/Project/test % c++ --version
52
+ clang version 10.0.0 (trunk 375507)
53
+ Target: x86_64-unknown-linux-gnu
54
+ Thread model: posix
55
+ InstalledDir: /usr/local/bin