2

いくつかの確率的部分が関与するシミュレーション環境を作成しました。正規分布、一様分布、対数正規分布から数値を引き出します。ほとんどの場合、これは正常に実行されますが、シミュレーションを 100 回ずつ実行しようとすると、次のエラーが表示されます。R6010 Abort() が呼び出されました。コンソールにエラーが表示されます:mersenne_twister::seed の引数が無効です。ただし、標準の疑似乱数ジェネレーター rand() のみを使用しています。mersene_twister を呼び出すことは決してありません。したがって、これはおそらく std::normal_distribution のメソッドです。

さらに、最初の X 回の反復ではなく、X 回の反復後にシード値が無効になるのはなぜですか?

誰もこのエラーの経験がありますか? これを解決する方法について誰か提案がありますか

Ps srand(time(0)) は、メインの最初で一度だけ呼び出されます。すべての乱数は、2 番目のクラス「random_num」で生成されます。Pssこれが乱数を生成する最良の方法ではない可能性があることは承知していますが、私の目的には十分です。

RNG に要求されたコード:

double random_num::uniform(int lb, int ub)//Generate uniformly distributed random numbers with lowerbound lb and upperbound ub
{
    //srand(time(0));
    double number;
    number =((double) rand() / (RAND_MAX+1)) * (ub-lb+1) + lb;

    return number;
}

double random_num::normal(double mean,  double var) //Generate normally distributed random numbers with mean and variance
{

    //srand(time(0));
    default_random_engine generator (rand());

    normal_distribution<double> distribution(mean, var);

    return distribution(generator);
}

double random_num::lognormal(double mean, double var, double offset)
{
    //srand(time(0));
    random_num dummy;
    double random;


    random = exp(dummy.normal(mean,var))-offset; //Calculate the 3 parameter lognormal

    return random;
}
4

1 に答える 1