読者です 読者をやめる 読者になる 読者になる

std::discard_block_engineクラスの挙動確認

C++

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)が出力されず、そのあと使用するブロック、破棄するブロック・・・のようにサイクルしていることがわかります。