スポンサーリンク

C++ で乱数

まずテスト用に以下のように関数宣言、定数の定義をしておく。

#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に非決定論的乱数を入れて効率化

// 非決定論的な乱数を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;

}

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: