目次
rand関数
rand関数は、C言語から引き継がれている標準ライブラリの関数で、古典的な乱数生成方法です。
実装例
#include <iostream>
#include <cstdlib> // rand(), srand()
#include <ctime> // time()
int main() {
std::srand(static_cast<unsigned int>(std::time(0))); // シード値の設定
// 0 から 99 の範囲で乱数を生成
for (int i = 0; i < 5; ++i) {
int random_number = std::rand() % 100;
std::cout << "Random number: " << random_number << std::endl;
}
return 0;
}
説明
- srand()で乱数のシード値を設定します。この例ではtime(0)を使って現在の時刻をシード値にしています。
- rand()は0からRAND_MAX(32767)の範囲で整数を生成します。これを特定の範囲内に収めるために、モジュロ演算子(%)を使います。
注意点
- rand()は擬似乱数生成器であり、制度があまり高くないです。
- モジュロ演算子を使用することで、結果に偏りが生じる場合があります。
randomライブラリ
C++11で導入された乱数生成のためのライブラリで、より柔軟で品質の高い乱数生成が可能です。
実装例
#include <iostream>
#include <random> // random_device, mt19937, uniform_int_distribution
int main() {
std::random_device rd; // 非決定論的な乱数生成器
std::mt19937 gen(rd()); // メルセンヌ・ツイスタ法による擬似乱数生成器
std::uniform_int_distribution<> dis(0, 99); // 0 から 99 の範囲の一様分布
// 乱数を生成
for (int i = 0; i < 5; ++i) {
int random_number = dis(gen);
std::cout << "Random number: " << random_number << std::endl;
}
return 0;
}
説明
- random_deviceは非決定論的な乱数(ハードウェア乱数)を生成しますが、一部の環境では擬似乱数になることもあります。
- mt19937はメルセンヌ・ツイスタ法に基づく擬似乱数生成器で、高速かつ品質の高い乱数を生成します。
- uniform_int_distributionを使って、指定した範囲内の整数を均等に分布するように乱数を生成します。
std::seed_seq
C++20では、新しい乱数生成機能が追加されましたが、基本的な使い方はC++11のものと変わりません。
実装例
#include <iostream>
#include <random> // random_device, mt19937, uniform_int_distribution, seed_seq
int main() {
std::random_device rd;
std::seed_seq seed{rd(), rd(), rd(), rd(), rd()}; // 複数の乱数からシードを生成
std::mt19937 gen(seed);
std::uniform_int_distribution<> dis(0, 99);
for (int i = 0; i < 5; ++i) {
int random_number = dis(gen);
std::cout << "Random number: " << random_number << std::endl;
}
return 0;
}
説明
- std::seed_seqを使うことで、複数の乱数からより複雑なシードを生成できます。
- 再現性を持たせたい場合や複数の乱数生成器を同じシードで初期化したい場合に適しています。