我创建了一个模拟环境,其中包含几个随机部分。我从正态,均匀和对数正态分布中绘制数字。在大多数情况下,这运行正常,但是,当我决定在彼此之后进行100次模拟时,我收到错误: 已经调用了R6010 Abort()。 在我的控制台中,我收到错误:mersenne_twister :: seed的无效参数。但是,我只使用标准的伪随机数生成器rand()。我决不叫mersene_twister。所以这可能是std :: normal_distribution。
的方法此外,我不知道为什么我的种子值在X次迭代后无效而不是前X次迭代?
有没有人有过这个错误的经验?有没有人有任何建议如何解决这个
P.S。 srand(time(0))仅在main的开头调用一次。虽然所有随机数都是在第二类“random_num”中生成的。 P.s.s我知道这可能不是生成随机数的最佳方法,但这对我来说已经足够了。
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;
}
答案 0 :(得分: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());