13

乱数生成に C++11 アプローチを使用しようとしています。

#include <random>
#include <functional>
#include <iostream>

int main(int argc, char *argv[])
{    
    std::normal_distribution<double> normal(0, 1);
    std::mt19937 engine; // Mersenne twister MT19937
    auto generator = std::bind(normal, engine);

    int size = 2;

    engine.seed(0);
    normal.reset();
    for (int i = 0; i < size; ++i)
        std::cout << generator() << std::endl;

    std::cout << std::endl;

    engine.seed(1);
    normal.reset();
    for (int i = 0; i < size; ++i)
        std::cout << generator() << std::endl;

    std::cout << std::endl;

    engine.seed(0);
    normal.reset();
    for (int i = 0; i < size; ++i)
        std::cout << generator() << std::endl;

    return 0;
}

出力は次のとおりです。

0.13453
-0.146382

0.46065
-1.87138

0.163712
-0.214253

つまり、1 番目と 3 番目のシーケンスは、同じ番号でシードされていても同一ではありません。お願いします、私は何を間違っていますか?それは

std::normal_distribution<double>

数学的な意味での単なる関数 (決定論的に x から y を生成する) または何か不足していますか? それが単なる関数である場合、reset メソッドは実際に何をしますか?

4

2 に答える 2