2013-07-01 87 views
2

我創建了一個模擬環境,其中包含幾個隨機部分。我從正態分佈,均勻分佈和對數正態分佈中繪製數字。但在大多數情況下,運行良好,但是,當我決定在彼此之後進行100次模擬時,出現錯誤: R6010 Abort()已被調用。 在我的控制檯中,我得到錯誤:mersenne_twister :: seed的參數無效。但是,我只使用標準的僞隨機數發生器rand()。在任何時候我都會打電話給mersene_twister。所以這可能是std :: normal_distribution的一個方法。mersenne twister的無效參數:: seed(C++)

此外,我不會爲什麼我的種子值在X迭代之後無效,而不是爲了第一次X迭代?

有沒有人有這個錯誤的經驗?有沒有人有任何建議如何解決這個

體育。 srand(時間(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; 
} 
+2

你是在一箇舊版本使用VS(如2012年之前)?調試模式下mt初始化的0錯誤似乎是一個已知問題。 – lip

+1

你可以分享你實例化和使用std分發的代碼部分嗎? – lip

+0

我添加了代碼部分 @lip我正在使用VS 2010 v10.0.30319.1 你在說什麼已知問題? – Siddler

回答

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());