C++で指定された範囲のランダムな数値を生成します
この投稿では、C++で指定された範囲のランダムな数値を生成する方法について説明します。
1.使用する std::uniform_int_distribution
最新のC++で2つの値(両端を含む)の間にランダムな数値を生成する簡単なソリューションは、 std::uniform_int_distribution
、指定された閉区間に均一に分散されたランダムな整数値を生成します。
次のソリューションは、指定された閉区間で高品質の整数ランダム数を生成します。 std::uniform_int_distribution
。それは使用しています std::random_device
標準のmersenne_twister_engineのシードを取得します std::mt19937
、メルセンヌツイスターアルゴリズムに基づいています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <iostream> #include <random> std::random_device rd; std::mt19937 gen(rd()); int random(int low, int high) { std::uniform_int_distribution<> dist(low, high); return dist(gen); } int main() { for (int i = 0; i < 10; i++) { std::cout << random(1, 100) << std::endl; } return 0; } |
上記のソリューションは短くエレガントですが、C++11準拠のコンパイラでのみ使用できます。 C++ 11より前は、BoostライブラリでMersenneTwisterを使用できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <iostream> #include <boost/random/mersenne_twister.hpp> #include <boost/random/uniform_int.hpp> #include <boost/random/variate_generator.hpp> boost::mt19937 engine; int random(int low, int high) { boost::uniform_int<> dist(low, high); boost::variate_generator<boost::mt19937&, boost::uniform_int<>> vgen(engine, dist); return vgen(); } int main() { for (int i = 0; i < 10; i++) { std::cout << random(1, 100) << std::endl; } return 0; } |
ヘッダーには他にもいくつかの事前定義された乱数ジェネレーターがあります <random>
、記載されているとおり ここ。次のソリューションは std::default_random_engine
乱数ジェネレータ std::uniform_int_distribution
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <iostream> #include <random> std::default_random_engine gen; int random(int low, int high) { std::uniform_int_distribution<> dist(low, high); return dist(gen); } int main() { for (int i = 0; i < 10; i++) { std::cout << random(1, 100) << std::endl; } return 0; } |
シードを検討してください std::default_random_engine
現在の時刻の乱数ジェネレータ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <iostream> #include <random> #include <chrono> unsigned seed = std::chrono::system_clock::now().time_since_epoch().count(); std::default_random_engine gen(seed); int random(int low, int high) { std::uniform_int_distribution<> dist(low, high); return dist(gen); } int main() { for (int i = 0; i < 10; i++) { std::cout << random(1, 100) << std::endl; } return 0; } |
2.使用する rand()
関数
指定された範囲のランダムな数値を生成するもう1つの一般的ですが、あまり好ましくない方法は、 rand()
関数。ヘッダーで定義されています <cstdlib>
0から0までのランダムな値を返します RAND_MAX
(両方を含む)。閉範囲でランダムな値を生成するには [low, high]
、式を使用できます low + rand() % (high - low + 1)
、播種後 rand()
ランダムな値(たとえば現在の時刻)で機能します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <iostream> #include <ctime> #include <random> int random(int low, int high) { return low + rand() % (high - low + 1); } int main() { srand(time(NULL)); for (int i = 0; i < 10; i++) { std::cout << random(1, 100) << std::endl; } return 0; } |
3.使用する std::experimental::randint
実験的ですが、 std::experimental::randint 指定された閉区間でランダムな整数を生成します。それはで定義されています <experimental/random>
ヘッダ。
1 2 3 4 5 6 7 8 9 10 11 |
#include <iostream> #include <experimental/random> int main() { for (int i = 0; i < 10; i++) { std::cout << std::experimental::randint(1, 100) << std::endl; } return 0; } |
これで、C++で指定された範囲の乱数を生成できます。