2

我创建了一个模拟环境,其中涉及多个随机部分。我从正态分布、均匀分布和对数正态分布中抽取数字。在大多数情况下,这运行良好,但是,当我决定一个接一个地进行 100 次模拟时,我得到了错误:R6010 Abort() 已被调用。在我的控制台中,我收到错误:mersenne_twister::seed 的参数无效。但是,我只使用标准的伪随机数生成器 rand()。我绝不会打电话给 mersene_twister。所以这可能是来自 std::normal_distribution 的一种方法。

此外,我不播种为什么我的种子值在 X 次迭代后无效,而不是第一次 X 次迭代?

有没有人有这个错误的经验?有没有人有任何建议如何解决这个问题

ps srand(time(0)) 仅在 main 开始时被调用一次。而所有随机数都是在第二类“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

2

@lip问题确实是 rand() 在某个时刻返回了零。并因此default_random_engine generator(0);流产。

解决方案非常简单:创建一个函数来检查 rand() 它不是零:

int rand0()
{
   int dummy = rand();
   while(dummy==0)
   {
     dummy = rand();
   }
   return dummy;
}

接着:default_random_engine generator(rand0());

于 2013-07-02T14:59:49.567 回答