「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