2013-07-01 1 views
2

몇 가지 확률적인 부분이 포함 된 시뮬레이션 환경을 만들었습니다. 나는 정규 분포, 균일 분포, 대수 정규 분포로부터 숫자를 끌어 낸다. 대부분의 경우에 이것은 잘 실행되지만 서로 100 회 시뮬레이션을하기로 결정했을 때 오류가 발생했습니다 : R6010 Abort()가 호출되었습니다. 내 콘솔에서 mersenne_twister :: seed에 대한 잘못된 인수 오류가 발생합니다. 그러나 표준 난수 생성기 rand() 만 사용하고 있습니다. 어떤 시점에서 나는 mersene_twister라고 부른다. 그래서 이것은 std :: normal_distribution의 메소드 일 것입니다.mersenne twister :: seed (C++)에 대한 인수가 잘못되었습니다.

게다가 왜 X 시드 반복은 아니고 제 시드 값이 유효하지 않은 이유를 설명하지 않습니까?

누구든지이 오류에 경험이 있습니까? 누구든지이 문제를 해결하는 방법에 대한 제안이 있습니까

P. srand (time (0))는 주 시작 부분에서 한 번만 호출됩니다. 모든 난수는 두 번째 클래스 인 "random_num"에서 생성됩니다. P.s.s이 방법이 난수를 생성하는 가장 좋은 방법은 아닐지 모르지만 제 목적으로는 충분합니다.

상기 RNG에 대한 요청과 같이 코드 : 문제 @lip

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를 사용하여 위치 : 다음

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

과 2012 년 이전)? 디버그 모드에서 mt 초기화시 0 오류가 알려진 문제로 보입니다. – lip

+1

표준 배포판을 인스턴스화하고 사용하는 코드 부분을 공유 할 수 있습니까? – lip

+0

코드 부분을 추가했습니다. @lip 사용중인 VS 2010 v10.0.30319.1 알려진 문제는 무엇입니까? – Siddler

답변

2

)은 (실제로 그 랜드이었다 어떤 순간에 0을 반환. 따라서 default_random_engine generator(0);이 중단되었습니다.

이 솔루션은 매우 간단했다 랜드() 그것이 0이 아닌 것을 확인 기능 만들기 : (같은 default_random_engine generator(rand0());

관련 문제