2017-05-08 1 views
-2

Je suis en train de créer un std :: discrete_distribution:Créer distribution discrète C de la liste

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

Tous les exemples que je l'ai vu la définir comme dans le lien ci-dessus std::discrete_distribution<> d({40, 10, 10, 40});

Mais au lieu de {40, 10, 10, 40} Je voudrais faire cela par programme, plutôt que codé en dur.

+3

[Le constructeur 2 prend les itérateurs.] (Http://en.cppreference.com/w/cpp/numeric/random/discrete_distribution/discrete_distribution) – user4581301

+0

Que voulez-vous dire par «par programmation»? Veuillez poser une question précise, en utilisant des termes objectifs. – ricab

Répondre

3

std::discrete_distribution a une constructor overload qui prend itérateurs, modifiant ainsi l'exemple de cppreference utiliser un 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"; 
    } 
} 

Le vecteur peut être chargé comme bon vous semble. Ici, j'ai utilisé la même liste d'initialisation pour générer des résultats similaires.

1

Vous pouvez utiliser l'autre constructeur défini pour discrete_distribution qui prend une paire d'itérateurs. Je viens de modifier le code de en.cppreference.com tel que discrete_distribution prend une paire d'itérateurs.

#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"; 
    } 
}