1

乱数ジェネレーターの状態をメンバー変数として維持したいので、このクラスから生成されたすべてのオブジェクトには独自の状態があります。オブジェクトが生成されるたびに、シードも変更される必要があります。

次のことを行いました。つまり、オブジェクトのコンストラクターを介してシードを変更しました。time(NULL) で行ったシード処理ですが、オブジェクトが 1 秒以内よりもはるかに速く作成されるため、これは十分に正確ではありません (笑)。

#include <iostream>
#include <cmath>
#include<random>
#include<chrono>
#include <ctime>


class Test{
public:
    Test();
    std::mt19937 rng;
    double randomNumber(double min, double max);

};
Test::Test(){
    rng.seed(time(NULL));
}

double Test::randomNumber(double min, double max){
    std::uniform_real_distribution<double> uniformDistribution(min, max);
    return uniformDistribution(rng);
}

int main(){
    Test a;
    Sleep(1000*1);
    Test b;

    for (int i = 0; i < 10; i++){
        std::cout << "Random number a: " << a.randomNumber(0, 10) << "\tRandom number b: " << b.randomNumber(0, 10) << std::endl;

    }

}

[ bames53 によるC++ クラスのシード rand() で説明されている方法に苦労しています。

この作品も含めて

std::mt19937 eng{ std::chrono::high_resolution_clock::now().time_since_epoch().count() };

クラス宣言に追加すると、次のエラーが発生します。

エラー: コンストラクターのインスタンスがありません "std::merseene_twister_engine<_Ty,_Wx, many more things> 引数の型は (std::chrono::system_clock::rep) です

エラーの原因と問題の解決方法が正確にはわかりません。私は多かれ少なかれC++の初心者であることを覚えておいてください。ありがとうございました!

4

1 に答える 1