【C++】乱数生成について解説
乱数とは?
乱数とは、予測できない順序で発生する数字のことを指します。例えば、サイコロを振った結果や、くじ引きで選ばれた番号などが乱数の例です。コンピュータで乱数を生成する際、完全に予測できない値を得るために、疑似乱数(擬似ランダム)のアルゴリズムを使用します。これにより、ランダムに見える数値が実際には決まった法則に従って生成されますが、ほとんどの用途では十分にランダムな値として使われます。
C++で乱数を生成する方法
C++では、乱数を生成するためのライブラリがいくつかあります。最も一般的なものは、cstdlib
ライブラリに含まれるrand()
関数ですが、C++11以降では、random
ライブラリが推奨されています。これにより、より高品質な乱数を得ることができます。
rand()を使った乱数の生成
最もシンプルな方法として、rand()
関数を使って乱数を生成できます。以下はその基本的な使い方です。
#include <iostream>
#include <cstdlib> // rand()関数を使用するため
#include <ctime> // time()関数を使用するため
int main() {
// 乱数の種を設定
std::srand(static_cast<unsigned int>(std::time(nullptr)));
// 乱数を生成
int random_number = std::rand();
std::cout << "生成された乱数: " << random_number << std::endl;
return 0;
}
std::srand()
関数は乱数の種(シード値)を設定します。これにより、プログラムを実行するたびに異なる乱数を得ることができます。std::rand()
関数は、0からRAND_MAX
(通常は32767)の範囲で整数を生成します。
randomライブラリを使った乱数の生成
C++11以降では、random
ライブラリを使うことで、より良い乱数を生成できます。以下の例では、std::uniform_int_distribution
を使って、指定した範囲の乱数を生成します。
#include <iostream>
#include <random> // randomライブラリを使用するため
#include <ctime>
int main() {
// 乱数の生成器と分布を定義
std::default_random_engine generator(static_cast<unsigned int>(std::time(nullptr)));
std::uniform_int_distribution<int> distribution(1, 100); // 1から100の範囲で乱数を生成
// 乱数を生成
int random_number = distribution(generator);
std::cout << "生成された乱数: " << random_number << std::endl;
return 0;
}
この方法では、std::default_random_engine
が乱数生成器として使われ、std::uniform_int_distribution
を使って生成される乱数の範囲を指定しています。これにより、特定の範囲内で均等な確率で乱数が生成されます。
乱数の範囲を指定する方法
乱数を生成する際、しばしば特定の範囲に収めたい場合があります。前述したように、std::uniform_int_distribution
を使うことで、範囲を簡単に指定できます。また、生成される乱数の範囲を変更するために、適切な分布を選択することが重要です。
範囲指定の例
例えば、1から100の範囲で乱数を生成する場合、以下のように指定します。
std::uniform_int_distribution<int> distribution(1, 100);
このコードでは、1
から100
の間の整数が均等に生成されます。また、浮動小数点の乱数を生成したい場合には、std::uniform_real_distribution
を使用します。
浮動小数点乱数の生成
浮動小数点数の乱数を生成するには、std::uniform_real_distribution
を使います。例えば、0.0から1.0までの乱数を生成するには、以下のように書きます。
std::uniform_real_distribution<double> distribution(0.0, 1.0);
乱数生成の注意点
乱数生成にはいくつかの注意点があります。特に、乱数のシードを設定しないと、毎回同じ乱数の列が生成されることがあります。これを防ぐためには、乱数のシードを適切に設定することが重要です。
シードの設定について
シードを設定することで、異なる乱数列を得ることができます。一般的に、シードには現在の時刻を使うことが多いです。std::time(nullptr)
を使って、現在の時刻をシードとして設定します。
高品質な乱数生成
C++11以降のrandom
ライブラリを使用することで、より高品質な乱数を生成できます。従来のrand()
関数に比べ、より予測不可能で均等な分布の乱数を生成できるため、乱数生成において重要な役割を果たします。
疑似乱数と真の乱数
コンピュータで生成される乱数は、疑似乱数です。疑似乱数は、一定のアルゴリズムに基づいて生成されるため、完全にランダムではなく、再現可能です。真の乱数は、物理的な現象に基づいて生成されますが、通常はコンピュータプログラムで使用されることは少ないです。