C++ で 0 と 1 の間の乱数を生成する方法
この記事では、0 から 1 の間隔で乱数の浮動小数点数を生成する方法について、いくつかの C++ の方法を説明します。
C++11 <random>
ライブラリを使用して 0 から 1 の間の乱数を生成する
C++11 バージョンでは、乱数および疑似乱数生成のためのクラス/メソッドが提供されています。これらの標準ライブラリ機能は、最新の C++ コードベースで乱数生成を扱うために推奨されています。
std::random_device
オブジェクトが最初に初期化されます。これは、次の行で初期化される乱数エンジン std::default_random_engine
をシードするために使用される非決定論的一様ランダムビットジェネレーターです。このようにして、エンジンが同じ番号シーケンスを生成しないことが保証されます。
C++ の <random>
ライブラリに実装されている乱数エンジンはいくつかありますが、時間や空間の要件などいくつかの要素で異なります(完全なリストはこちらを参照してください)。以下の例では、std::default_random_engine
を用いてランダムな浮動小数点演算を行っています。アプリケーションの制約で必要なアルゴリズムエンジンを指定することができます。次のステップでは、一様分布を初期化し、min/max 値を引数として渡します。最後に、[0-1]間隔で 5つのランダムな浮動小数点値をコンソールに出力します。
#include <iomanip>
#include <iostream>
#include <random>
using std::cout;
using std::endl;
using std::setprecision;
constexpr int FLOAT_MIN = 0;
constexpr int FLOAT_MAX = 1;
int main() {
std::random_device rd;
std::default_random_engine eng(rd());
std::uniform_real_distribution<float> distr(FLOAT_MIN, FLOAT_MAX);
for (int n = 0; n < 5; ++n) {
cout << setprecision(6) << distr(eng) << "\n";
}
return EXIT_SUCCESS;
}
出力:
0.22808
0.343274
0.408204
0.687902
0.572947
テンプレートパラメータとして float
、double
、long double
のいずれかを渡さなかった場合、std::uniform_real_distribution< T >
は未定義のの動作をすることに注意してください。
C++ で 0 と 1 の間のランダムなフロートを生成するには、関数 std::rand
を利用する
rand
関数は C 標準ライブラリの乱数生成機能の一部です。高品質の乱数性を必要とするアプリケーションには推奨されません。しかし、テスト目的や暗号に影響を受けない数値生成のために利用することはできます。
関数 rand
は 0 から RAND_MAX
(いずれも含む) の間の擬似乱数を生成します。RAND_MAX
の値は実装に依存しており、保証される最小値は 32767 しかないので、生成される数値には制約があります。この関数は std::srand
でシードされていなければならないことに注意してください(できれば std::time
を用いて現在の時刻を渡すことが望ましいです)。最後に、[0-1]の間隔で浮動小数点値を生成します。
#include <iomanip>
#include <iostream>
#include <random>
using std::cout;
using std::endl;
using std::setprecision;
constexpr int FLOAT_MIN = 0;
constexpr int FLOAT_MAX = 1;
int main() {
std::srand(std::time(nullptr));
for (int i = 0; i < 5; i++)
cout << setprecision(6)
<< FLOAT_MIN +
(float)(rand()) / ((float)(RAND_MAX / (FLOAT_MAX - FLOAT_MIN)))
<< endl;
return EXIT_SUCCESS;
}
出力:
0.483029
0.252537
0.264023
0.90233
0.573071