cpprefjpにリファレンスを書くために、乱数のエンジンアダプタであるstd::discard_block_engineクラスの挙動を確認するコードを書いた。
#include <iostream> #include <random> // [0, 1, 2, 3.....)のように、単にカウンタを進めていくだけのエセ乱数生成器 class sequence_generator { size_t value_ = 0; public: using result_type = size_t; sequence_generator(result_type = 0) {} void seed(result_type) {} static result_type min() { return 0; } static result_type max() { return 65537; } result_type operator()() { return value_++; } void discard(size_t z) { for (size_t i = 0; i < z; ++i) { (*this)(); } } }; int main() { // ブロック全体のサイズp : 3 // 使用するサイズr : 2 // 破棄するサイズ : p - r == 1 std::discard_block_engine<sequence_generator, 3, 2> engine; for (int i = 0; i < 10; ++i) { std::cout << engine() << std::endl; } }
0 1 3 4 6 7 9 10 12 13
使用するブロック(0, 1)が選択されたあと、破棄するブロック(2)が出力されず、そのあと使用するブロック、破棄するブロック・・・のようにサイクルしていることがわかります。