目次
rand関数を使用する(c++14以降は非推奨)
stdlib
をインポートすることで使用することができるようになります。
RAND_MAX
までの値をシード値を基にランダムに取得する関数です。(線形合同法)
- シード値を使用して乱数を生成しているので、シード値を変えない限り、プログラムを実行するたびに同じ値が生成されてしまいます。
- シード値を使用して生成する乱数を
疑似乱数
という
上記の説明の通り、rand関数はシード値の書き換えを行う必要があるので、ランダムな値を使用する手順としては、
- シード値の設定 : srand(シード値)
- 疑似乱数の取得 : rand()
シード値使用する数字は、現在時刻
がメジャーです。
コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #include <iostream> #include <cstdlib> #include <time.h>
using namespace std;
int main(int argv, char* argc[]) {
srand((unsigned int)time(NULL));
int randomValue = rand();
cout << randomValue << endl;
return 0; }
|
範囲指定してランダムな値を生成する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #include <iostream> #include <cstdlib> #include <time.h>
using namespace std;
int main(int argv, char* argc[]) {
srand((unsigned int)time(NULL));
int randomValue = rand();
int value = randomValue % 6 + 1;
cout << value << endl;
return 0; }
|
c++11以降を使用する場合、randomライブラリ
を使用する
c++11以降では、rand関数は非推奨になっています。代わりにrandom.hが用意され、random_device
を使用することができます。
random_device
は、rand関数と違い、シード値の初期化が必要ないのでより直観的に使用することができます。
コード
1 2 3 4 5 6 7 8 9 10 11 12 13
| #include <iostream> #include <random>
using namespace std;
int main(int argv, char* argc[]) {
random_device rand;
cout << rand() << endl;
return 0; }
|
範囲指定してランダムな値を生成する
uniform_int_distribution
を使用することで、%Nで計算するよりも精度の高い一様分布乱数
を生成することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #include <iostream> #include <random>
using namespace std;
int main(int argv, char* argc[]) {
random_device rand;
uniform_int_distribution<> rand6(1, 6);
for (int i = 0; i < 100; i++) { cout << rand6(rand) << endl; }
return 0; }
|
まとめ
c++11以降のバージョンでは、rand関数は非推奨になっています。それ以降のC++バージョンを使用できる場合は、基本的にはrandomライブラリを使用した方法がいいと思います。
参考