2016-10-16 2 views
-1

Après le discours de Stephan T. Lavavej (voir here), j'utilise un générateur de nombres aléatoires Mersenne Twister et je produis des nombres aléatoires avec ce genre de codeTypes de générateurs de nombres aléatoires et les fonctions qui les prennent comme arguments

#include <iostream> 
#include <random> 
int main() 
{ 
    std::mt19937 mt(132); 
    std::uniform_int_distribution<int> dist(0,50); 
    for (int i =0;i<10;i++) 
    { 
    std::cout << dist(mt) << std::endl; 
    } 
} 

Je voudrais mélanger en utilisant la fonction shuffle (et non la fonction random_shuffle) (comme recommandé dans le discours à nouveau). De cppreference.com, je vois la fonction prend un URBG&& comme argument. Je ne comprends pas vraiment ce qu'est un URBG. J'ai essayé de nourrir le mt19937 à la place et cela semble fonctionner correctement.

#include <iostream> 
#include <random> 
int main() 
{ 
    std::vector<int> v; 
    v.push_back(1); 
    v.push_back(2); 
    v.push_back(3); 
    v.push_back(4); 

    std::mt19937 mt(132); 

    std::shuffle(v.begin(),v.end(),mt); 
    for (int i=0;i<v.size();i++) 
    { 
    std::cout << v[i] << std::endl; 
    } 
} 

Question

  • Qu'est-ce qu'un URBG? Est-ce que mt19937 est une sous-classe de URBG?
  • Est-ce que tous les types de générateurs de nombres aléatoires donnés en argument à une fonction peuvent produire un résultat stochastique (tel que rand, shuffle ou toute autre fonction de random.h)?
+0

Si vous regardez la référence que vous liez à nouveau, alors vous verrez que 'URBG' est un argument de modèle. Le type est tout ce qui correspond à l'interface de par ex. la classe 'std :: mt19937'. Voir la section "Exigences de type" de la référence liée pour plus d'informations. –

Répondre

2

URBG est le nom de l'argument modèle; il peut être déduit à une variété de types, y compris std::mt19937.Si vous regardez plus bas sur les pages cppreference, vous verrez:

g - un UniformRandomBitGenerator dont le type de résultat est convertible à std :: iterator_traits :: difference_type

Donc URBG peut être tout type tel que que:

  • URBG::result_type est un type entier non signé
  • URBG::min() retourne le URBG::result_type plus petit que operator() pourrait retourner (s trictly inférieure à max)
  • URBG::max() retourne le plus grand URBG::result_type que operator() pourrait retourner (strictement supérieur min)
  • URBG::operator() (appliqué à l'exemple fourni) retourne, en temps constant amorti, une valeur dans l'intervalle fermé [URBG::min(), URBG::max()]
  • URBG::result_type est convertible en std::iterator_traits<RandomIt>::difference_type

les nouveaux générateurs de nombres aléatoires ont généralement une certaine forme d'Etat, mais si la fonction de bibliothèque peut accepter que d'une certaine façon (par exemple, en prenant un échantillon aléatoire g objet enerator comme std :: shuffle), alors bien sûr, ils pourraient être utilisés.

2

Un URBG est un générateur de bits aléatoire uniforme. En langage C++, il s'agit d'un objet fonction renvoyant des valeurs entières non signées avec une distribution de probabilité uniforme (c'est-à-dire que chaque résultat possible est également susceptible de se produire comme tout autre). Ces exigences sont bien entendu rigoureusement définies dans la norme.

std::mt19937 Les instances sont des URBG car elles satisfont à cette définition. std::uniform_int_distribution instances le satisfont également, donc dans ce cas il n'y a absolument aucune différence entre passer l'un ou l'autre aux fonctions <random>.

Cependant, notez que la plupart des distributions définies dans <random> sont pas uniforme par la conception, de sorte qu'ils ne peuvent pas être utilisés lorsqu'un URBG est prévu (vous obtiendrez des résultats faussés).