2017-05-13 15 views
0

헬로 있어요! C++로 코딩하기 시작했으며 난수 생성기를 올바르게 사용하는 방법을 잘 모릅니다. 예를 들어, 범위 [0,30000]의 숫자가 필요합니다. 내 범위에서 작은 숫자 만 얻지 못하도록하는 방법입니다. 내 기능 :mt19937 및 정규 분포

std::random_device rd; 
std::mt19937 rng(rd()); 
int myRand(int i) { 
    std::normal_distribution<double> distribution(30, 1500); 
    double temp=distribution(rng); 
    if(temp<0){ 
     temp*=(-1); 
    } 
    return (int) std::round(temp)%i; 
} 

당신은 나를 제대로 normal_distribution를 구성하는 데 도움시겠습니까?

+0

정말 정말 이상한 배포판입니다. 거기서 계산하고 있습니다. 의도 한 배포판은 무엇입니까? – harold

+0

완전히 솔직하게, 나는이 사이트를 일부 사이트에서 발견했습니다. 내가 필요로하는 것은 [0, n]에서 많은 숫자입니다. 모든 숫자는 동일한 확률로 선택되어야합니다. – ogarogar

+2

이것은 'uniform_int_distribution'을 참조하십시오. – harold

답변

4

"정규 분포"는 "정규 분포"를 의미하지 않습니다. 수학에서 정의한대로 normal distribution을 의미합니다. 그것은 당신이 원하는 것이 아닙니다.

당신이 찾고있는 것은 uniform_real_distribution이며 주어진 범위의 수레가 튀어 나옵니다. 그러나 반 개방 범위에서만이 작업을 수행합니다. 당신은 uniform_int_distribution을 사용할 수

std::uniform_real_distribution<double> distribution(0, 30000); 
double temp=distribution(rng); 

이 0을 반환 할 수 있습니다,하지만 당신은 폐쇄 된 범위의 정수를 원하는 경우는 30000

을 반환하지 않습니다.

+3

'uniform_int_distribution'에는 닫힌 범위가 있음을 알 수 있습니다. – juanchopanza