【C++】乱数の使い方と種類

目次

rand関数を使用する(c++14以降は非推奨)

  • stdlibをインポートすることで使用することができるようになります。
  • RAND_MAXまでの値をシード値を基にランダムに取得する関数です。(線形合同法)
    • シード値を使用して乱数を生成しているので、シード値を変えない限り、プログラムを実行するたびに同じ値が生成されてしまいます。
    • シード値を使用して生成する乱数を疑似乱数という

上記の説明の通り、rand関数はシード値の書き換えを行う必要があるので、ランダムな値を使用する手順としては、

  1. シード値の設定 : srand(シード値)
  2. 疑似乱数の取得 : rand()

シード値使用する数字は、現在時刻がメジャーです。

コード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <cstdlib> // rand関数を使用するのに必要
#include <time.h> // time関数を使用するのに必要

using namespace std;

int main(int argv, char* argc[]) {

// 1. シード値の設定
srand((unsigned int)time(NULL));

// 2. 疑似乱数の取得
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> // rand関数を使用するのに必要
#include <time.h> // time関数を使用するのに必要

using namespace std;

int main(int argv, char* argc[]) {

// 1. シード値の設定
srand((unsigned int)time(NULL));

// 2. 疑似乱数の取得
int randomValue = rand();

// 範囲を指定
// % 0からの数字の個数 + 最小値
// 今回の場合 : 1~6
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ライブラリを使用した方法がいいと思います。

参考

Author

Daiki Iijima

Posted on

2021-09-05

Updated on

2024-04-17

Licensed under