2012-10-18 3 views
1
// construct a trivial random generator engine from a time-based seed: 
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count(); 
std::default_random_engine generator (seed); 

std::normal_distribution<int> distribution (132,20); 

std::cout << "some Normal-distributed results:" << std::endl; 
for (int i=0; i<10; ++i) 
    std::cout << distribution(generator) << std::endl; 

내가 "0으로 정수 나누기"런타임 오류가 cplusplus에서이 코드 예제에서. 내가 바꾼 유일한 것은 double에서 int까지 normal_distribution의 유형과 평균 및 표준 편차입니다.표준 : normal_distribution <int> 런타임 오류 "정수 나누기 0으로"

모든 요일?

+0

는 "까지"변경? 이것들과 같은 문장들은 일종의 "평균"이지만 "표준"이 아닙니다 ... :) –

+0

미안 괄호가 내 타입을 먹었습니다. – ManuelSchneid3r

+0

@DevNoob : 이런 종류의 문제를 피하기 위해 백틱에 인라인 코드 예제를 둘러 쌀 수 있습니다. – Mankarse

답변

4

std::normal_distribution에 대한 템플릿 매개 변수는 부동 소수점 유형 (float, double 또는 long double)이어야합니다. 다른 것을 사용하면 정의되지 않은 동작이 발생합니다.

정규 분포는 연속 분포이기 때문에 int 유형을 사용할 때 예상되는 결과가 명확하지 않습니다. 어쩌면 normal_distribution<double>을 사용하고 결과를 int으로 반올림하여 원하는 결과를 얻을 수 있습니다.

0

binomial_distribution을 기본 확률 값 0.5와 함께 사용할 수 있습니다.

평균값이 t/2 인 경우 (t가 (t + 1)/2 인 경우) (t-1)/2가 동일한 prob를 갖는 경우 [0,). 필요에 따라 결과에 상수를 추가하여 그에 따라 t 값을 설정하고 시프트 할 수 있습니다.

이항 분포는 정규 분포의 이산 근사치입니다 (link). 정규 분포에는 이론적으로 상한/하한이 없습니다.

나는 원래 이상 얇은 래퍼 다음 사용하는 것을 선호 :

template <typename T> 
class NormalDistribution { 
private: 
    std::mt19937 mt; 
    std::normal_distribution<T> dis; 
public: 
    NormalDistribution(T mu, T sigma):dis(mu, sigma) { 
    std::random_device rd; 
    mt.seed(rd()); 
    } 

    NormalDistribution(T mu, T sigma, unsigned seed):dis(mu, sigma) { 
    mt.seed(seed); 
    } 

    T random() { 
    return dis(mt); 
    } 
}; 

template <> 
class NormalDistribution<int> { 
private: 
    std::mt19937 mt; 
    std::binomial_distribution<int> dis; 
    int _min; 
public: 
    NormalDistribution(int min, int max):dis(max-min) { 
    std::random_device rd; 
    mt.seed(rd()); 
    } 

    NormalDistribution(int min, int max, unsigned seed):dis(max-min), _min(min) { 
    mt.seed(seed); 
    } 

    int random() { 
    return dis(mt)+_min; 
    } 
};