2017-05-08 66 views
-2

我想創建一個std :: discrete_distribution離散分佈:創建C++從列表

http://en.cppreference.com/w/cpp/numeric/random/discrete_distribution

所有的例子我見過定義它像上面的鏈接std::discrete_distribution<> d({40, 10, 10, 40});

但是,相反的{40, 10, 10, 40}我想以編程方式執行此操作,而不是硬編碼。

+3

[構造函數2需要迭代器。](http://en.cppreference.com/w/cpp/numeric/random/discrete_distribution/discrete_distribution) – user4581301

+0

「程序化」是什麼意思?請使用客觀條件提出確切的問題。 – ricab

回答

3

std::discrete_distributionconstructor overload這需要迭代器,所以修改cppreference的例子使用std::vector

#include <iostream> 
#include <map> 
#include <random> 
#include <vector> 

int main() 
{ 
    std::random_device rd; 
    std::mt19937 gen(rd()); 

    std::vector<int> list{40, 10, 10, 40}; 
    std::discrete_distribution<> d(list.begin(), list.end()); 
    std::map<int, int> m; 
    for(int n=0; n<10000; ++n) { 
     ++m[d(gen)]; 
    } 
    for(auto p : m) { 
     std::cout << p.first << " generated " << p.second << " times\n"; 
    } 
} 

但是你喜歡的載體可以加載。這裏我使用了相同的初始化器列表來生成相似的結果。

1

您可以使用爲discrete_distribution定義的另一個構造函數,該構造函數需要一對迭代器。我剛剛修改了en.cppreference.com中的代碼,因此discrete_distribution需要一對迭代器。

#include <iostream> 
#include <map> 
#include <random> 

int main() 
{ 
    std::random_device rd; 
    std::mt19937 gen(rd()); 
    std::array<int, 4> a{40, 10, 10, 40}; 
    std::discrete_distribution<> d(a.begin(), a.end()); 
    std::map<int, int> m; 
    for(int n=0; n<10000; ++n) { 
     ++m[d(gen)]; 
    } 
    for(auto p : m) { 
     std::cout << p.first << " generated " << p.second << " times\n"; 
    } 
}