2012-10-18 49 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; 

從這個代碼示例從cplusplus我「由零整數除法」獲得運行時錯誤。我唯一改變的是從doubleint的normal_distribution類型及其平均值和標準偏差。的std :: normal_distribution <int>運行時錯誤「整數除以零」

任何意見?

+0

「來自於」改變?像這些句子是「意味着」,但不是「標準」... :) –

+0

對不起尖括號吃了我的類型; – ManuelSchneid3r

+0

@DevNoob:你可以用反引號包圍內聯代碼示例以避免這類問題。 – Mankarse

回答

4

std::normal_distribution的模板參數必須是浮點型(float,doublelong double)。使用其他任何東西都會導致未定義的行爲。

由於正態分佈是一個連續分佈,所以當使用int類型時,您期望它做什麼並不十分清楚。也許你可以通過使用normal_distribution<double>得到你想要的結果,並將結果四捨五入到int

0

您可以使用binomial_distribution,默認概率值爲0.5。 link

它將返回範圍[0,t]中的整數值,其均值爲t/2(如果t是偶數其他(t + 1)/ 2,(t-1)/ 2具有相等的概率)。您可以相應地設置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; 
    } 
};