Génération de nombres aléatoires avec la lib std random

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Salut à tous,

tout à l'heure je cherchais comment générer des nombres (pseudo) aléatoires (dans mon cas se sont des entiers) avec la lib std random qui a été implémentée avec le c++11. J'ai trouvé le code pour le faire sur cppreference mais je me demande quelques trucs dessus.

D'abord voici le code :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include <random>
#include <iostream>

int main()
{
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dis(1, 6);

    for (int n=0; n<10; ++n)
        std::cout << dis(gen) << ' ';
    std::cout << '\n';
}

Du coup je me demandais surtout à quoi servent chaqu'un de ces objets, pour le std::mt19937 j'ai compris que c'était une fonction de génération de nombre pseudo aléatoire mais sinon je ne comprend pas à quoi servent la random_device et la uniform_int_distribution. Et en même temps je me demandais aussi pourquoi ils ont choisi de faire la lib ainsi.

J'espère que vous saurez répondre à mes question et je vous remercie d'avance pour vos réponses. :)

« La Nature est un livre écrit en langage mathématique », Galilée

+2 -0

Cette réponse a aidé l'auteur du sujet

Pour la random_device je ne suis pas sûr de pouvoir répondre, je ne l'ai pas utilisée moi-même. JE suppose qu'elle permet d'initialiser le générateur de nombres aléatoires avec une graine provenant du système. Typiquement ça doit probablement encapsuler quelqeu chose comme /dev/urandom sur du unixoïde.

Par contre pour le reste, en général, les auteurs de la lib ont souhaité séparer l'algorithme de génération d'une part, et la distribution des nombres en sortie.

Les algorithmes « bruts » génèrent la plupart du temps soit des nombres entiers dans un intervalle défini et fixe, soit des nombres réels compris entre 0 et 1. Entre les nombres ainsi générés par les algorithmes bruts, et les nombres qu'on souhaite avoir en sortie pour une utilisation pratique, il faut faire une transformation.

On veut séparer clairement les deux étapes: génération, puis transformation pour se conformer à une distribution statistique donnée. L'objectif c'est de rendre les deux parties indépendantes et combinables à souhait: je choisis un algorithme de génération et je me fiche de savoir ce qu'il génère et comment d'une part, et d'autre part je veux que mes nombres en sortie obéissent à une distribution statistique que je définis, peu importe l'algorithme de génération utilisé à la base.

Édité par QuentinC

Ma plateforme avec 23 jeux de société classiques en 6 langues et 13000 joueurs: http://qcsalon.net/ | Apprenez à faire des sites web accessibles http://www.openweb.eu.org/

+0 -0

Cette réponse a aidé l'auteur du sujet

En fait, random_device est un autre générateur d'aléatoire. Il a la particularité d'être vraiment aléatoire sur les systèmes qui le supportent (MVC le fait sur Windows, GCC sur Linux, pas de nouvelle de MinGW/TDM-GCC sur Windows par contre). Or, ce générateur est plutôt lent. On préfère donc l'utiliser pour créer une seed très aléatoire qui sera utilisée par un générateur pseudo aléatoire comme mt19937. Cette utilisation permet d'avoir la vitesse du mt19937 avec l'aléatoire du random_device.

Édité par victorlevasseur

+0 -0
Auteur du sujet

Merci pour vos réponses, la présentation était très intéressante. Maintenant que je suis éclairé je vais pouvoir utiliser la lib plus facilement. :)

« La Nature est un livre écrit en langage mathématique », Galilée

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte