まずテスト用に以下のように関数宣言、定数の定義をしておく。
#include <iostream> #include <random> // 乱数用 constexpr int TESTCOUNT = 10; /////////////////////////// void cpp_rand_test_1(); void cpp_rand_test_2(); void cpp_rand_test_3(); void cpp_rand_test_4(); void cpp_rand_test_5(); /////////////////////////// int main() { cpp_rand_test_1(); //cpp_rand_test_2(); //cpp_rand_test_3(); //cpp_rand_test_4(); //cpp_rand_test_5(); }
// 疑似乱数 基本 void cpp_rand_test_1() { // *疑似乱数 // *初期シードが同じなら毎回同じ値が出る // *64bitの範囲が欲しいなら std::mt19937_64 std::mt19937 mt(0/*初期シード*/); for (size_t i = 0; i < TESTCOUNT; i++) std::cout << mt() << std::endl; }
// 範囲指定 , 一様乱数 void cpp_rand_test_2() { // 疑似乱数 std::mt19937 mt(0/*初期シード*/); // 0~5の範囲の一様乱数作成用 // float型が欲しいなら std::uniform_real_distribution<> std::uniform_int_distribution<> idistri(0, 5); for (size_t i = 0; i < TESTCOUNT; i++) std::cout << idistri(mt) << std::endl; }
// 正規分布乱数 void cpp_rand_test_3() { // 疑似乱数 std::mt19937 mt(0/*初期シード*/); // 正規分布乱数作成用 std::normal_distribution<> norm(50.0/*平均*/, 10.0/*分散*/); for (size_t i = 0; i < TESTCOUNT; i++) std::cout << norm(mt) << std::endl; }
// 非決定論的な乱数 void cpp_rand_test_4() { // 注意点: // *どんな値が出るか分からない // *遅い // *ハードウェアを使うのでプラットフォームによっては実装不可 // (実装できない場合は疑似乱数として動く) std::random_device rng; for (size_t i = 0; i < TESTCOUNT; i++) std::cout << rng() << std::endl; }
// 非決定論的な乱数をseedに疑似乱数を生成 void cpp_rand_test_5() { // 非決定論的な乱数 std::random_device rng; // 疑似乱数 std::mt19937 mt(rng()/*初期シード*/); for (size_t i = 0; i < TESTCOUNT; i++) std::cout << mt() << std::endl; }