生成するビット幅を指定可能なrandom_deviceクラスを書いた

64ビット版メルセンヌ・ツイスターはいつ使うか」に関連して、64ビットのシードを作れるように、生成する整数型を指定できるrandom_deviceクラスを書きました。

Boost.Randomの実装をコピペしてきてちょっと変えただけです。

インタフェース:

// <shand/random/random_device.hpp>
namespace shand {
   template <class UIntType>
   class random_device {
     using result_type = UIntType;

     explicit random_device(const std::string& token = implementation-defined);
     result_type operator()();

     template <class Iterator>
     void generate(Iterator first, Iterator last);
   };

   using random_device_32 = random_device<std::uint32_t>;
   using random_device_64 = random_device<std::uint64_t>;
}

標準やBoost.Randomのものと違うのは、以下の点:

  • クラステンプレートになっている
  • テンプレートパラメータとして、生成する整数型をとる
  • entropy()メンバ関数がない
    • 有意義な結果は誰も返せないので、必要ないと判断した。

mt19937_64のシードを作るために、64ビット版random_device型であるrandom_device_64を使えます。

#include <iostream>
#include <cstdint>
#include <random>
#include <shand/random/random_device.hpp>

int main()
{
    shand::random_device_64 seed_gen;
    std::mt19937_64 engine(seed_gen());

    for (int i = 0; i < 10; ++i) {
        std::uint64_t result = engine();
        std::cout << result << std::endl;
    }
}

出力例:

3893701729893995308
10711700309771701362
17929754974751635565
17553023603653786827
13502565356887369052
10931010143106186937
4547535530895765923
153507564072994118
1189766131898797718
5246883299549427354