C++でランダムなfloat値を生成します
この投稿では、C++でランダムなfloat値を生成する方法について説明します。
1.使用する std::uniform_real_distribution
C++ 11以降、2つの数値間で均一に分散された浮動小数点値を生成できます。 std::uniform_real_distribution
。閉区間で高品質の浮動小数点ランダム値を生成する次のコードについて考えてみます。 [1, 10]
を使用して std::uniform_real_distribution
。それは使用しています std::random_device
標準のmersenne_twister_engineのシードを取得します std::mt19937
、メルセンヌツイスターアルゴリズムに基づいています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <iostream> #include <random> int main() { std::random_device rd; std::mt19937 gen(rd()); std::uniform_real_distribution<> dist(1, 10); for (int i = 0; i < 100; i++) { std::cout << dist(gen) << std::endl; } return 0; } |
ヘッダーで定義されている他の多数の事前定義された乱数ジェネレーターがあることに注意してください <random>
、記載されているとおり ここ。 C++ 11より前は、BoostライブラリでMersenne Twisterを使用して、ランダムなfloat値を生成できました。たとえば、次のソリューションは Boost.Random
と boost::random::uniform_real_distribution
と std::mt19937
閉範囲でランダムな浮動小数点値を生成するアルゴリズム [1, 10]
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <iostream> #include <boost/random/mersenne_twister.hpp> #include <boost/random/uniform_real_distribution.hpp> int main() { boost::random::mt19937 gen; boost::random::uniform_real_distribution<> dist(1, 10); for (int i = 0; i < 100; i++) { std::cout << dist(gen) << std::endl; } return 0; } |
2.使用する rand()
関数
C++で疑似乱数を生成するためのもう1つの単純ですが、あまり好ましくない解決策は、 rand()
関数。間のランダムな数値を返します 0
と RAND_MAX
、および任意の閉区間で浮動小数点ランダム値を生成するために使用できます。乱数ジェネレーターにシードすることを忘れないでください srand()
呼び出す前に rand()
。両方 rand()
と srand()
関数はで定義されています <cstdlib>
ヘッダ。
たとえば、次のようにすると、近距離で浮動小数点数が生成されます。 [0, 1]
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <iostream> #include <random> #include <ctime> int main() { srand(time(NULL)); for (int i = 0; i < 100; i++) { float r = rand() / static_cast<float>(RAND_MAX); std::cout << r << std::endl; } return 0; } |
ソリューションを簡単に拡張して、指定した2つの値の間に任意のfloat値を生成できます。たとえば、式 low + rand() * (high - low) / RAND_MAX;
閉範囲でランダムな浮動小数点値を生成します [low, high]
、以下に示すように:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <iostream> #include <random> #include <ctime> int main() { int low = 1; int high = 10; srand(time(NULL)); for (int i = 0; i < 100; i++) { float r = low + static_cast<float>(rand()) * static_cast<float>(high - low) / RAND_MAX; std::cout << r << std::endl; } return 0; } |
これで、C++でランダムなfloat値を生成できます。