Génération aléatoire générant toujours la même suite

Le problème exposé dans ce sujet a été résolu.

Bonjour chers agrumes.

Mon sujet ressemble beaucoup à celui-ci me direz-vous.
Malheureusement, mon problème n’est pas résolu, même après lecture de ce dernier.

Voici mon code :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include <random>
using namespace std;

int main()
{
    random_device rd;
    mt19937 mt(rd());
    uniform_int_distribution<int> dist(0, 99);

    for(int i = 0; i < 10; ++i)
        cout << dist(mt) << ' ';
    cout << endl;
}

J’utilise MinGW sur Windows 8 et j’obtiens toujours la même séquence. Je n’ai pas essayé sur Linux (et j’ai la flemme de redémarrer mon PC).

Avec l’ajout d’iostream, ton code me donne :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
 amarok@localhost  ~  vi main.cpp
 amarok@localhost  ~  g++ main.cpp --std=c++11
 amarok@localhost  ~  ./a.out           
21 67 72 20 88 77 18 51 14 19 
 amarok@localhost  ~  ./a.out
73 54 66 56 40 93 92 81 39 67 
 amarok@localhost  ~  ./a.out
78 52 28 16 97 92 4 19 57 30 
 amarok@localhost  ~  ./a.out
63 71 21 79 36 24 40 38 93 98 
 amarok@localhost  ~  ./a.out
73 59 7 66 1 56 91 9 54 23 
 amarok@localhost  ~  ./a.out
63 50 83 74 48 90 33 55 42 74 
 amarok@localhost  ~  ./a.out
8 42 78 12 82 59 26 89 2 90 
 amarok@localhost  ~  ./a.out
51 42 58 94 48 34 4 61 78 57 
 amarok@localhost  ~  ./a.out
72 17 88 67 24 75 26 79 99 48 
 amarok@localhost  ~  ./a.out
41 58 24 35 1 42 10 1 78 20 

Du coup, il me semble que c’est ce que tu souhaites.

Cependant, d’après ce thread on peut lire:

ww2: Unlike VC, GCC hasn’t implemented random_device nondeterministically on Windows. Boost has, so you can use Boost.Random.

Et sur cette page

std::random_device may be implemented in terms of an implementation-defined pseudo-random number engine if a non-deterministic source (e.g. a hardware device) is not available to the implementation. In this case each std::random_device object may generate the same number sequence.

Du coup, ton code est bon, mais gcc sur windows te donnera toujours le même truc…

J’ai installé boost et il faut un binaire pour random_device. En lisant leur tuto, ils disent qu’il y a un dossier "lib" dans l’archive à télécharger. Mais je n’ai pas de dossier "lib" (il y a "libs" mais c’est autre chose).

Je cherche sur leur site mais je dois pas être doué, j’arrive pas à trouver ces satanés binaires.

+0 -0

Cette solution est bien connue, c’est ce que j’ai toujours fait en C. Mais comme là je me mets au C++171, je voulais faire ça proprement (je viens de voir une vidéo qui explique par A+B que la méthode habituelle avec srand(time(0)) et le modulo sont à "vomir").
Mais bon, je m’amuse à coder un petit jeu de carte que j’ai découvert récemment donc je crois que je vais me contenter de time(0) sur GCC-MinGW. J’essayerai avec GCC sur Linux, d’après ce que j’ai lu, je n’aurai pas ce problème.

N’empêche que j’arrive pas à mettre la main sur le binaire de Boost.Random, c’est fou quand même (dans l’archive à télécharger, il n’y a pas de dossier "lib" avec les binaires).

EDIT : Je suis un boulet. J’avais lu le "Getting started" de Boost à la va-vite et en relisant attentivement, je vois qu’il faut compiler les binaires soi-même (la plupart des headers Boost sont inline et n’ont donc pas besoin d’être accompagnés de binaires). Je sais ce qu’il me reste à faire !


  1. D’ailleurs, j’en profiterai pour poster mon code sur les forums. J’espère que des gens sauront m’aider pour améliorer mon code, de façon générale, mais surtout pour utiliser au mieux les MAJs du C++. 

+0 -0

Une solution plus simple, si la génération de nombres aléatoires n’est pas critique (crytpo), tu peux simplement utiliser le temps comme graine pour le générateur. Cf http://guillaume.belz.free.fr/doku.php?id=nombres_aleatoires

gbdivers

Pas besoin de faire de la crypto pour en éprouver les limites, j’ai eu le soucis (quelques centaines de milliers de tirages). Et j’ai cru comprendre qu’initialiser n’était pas si facile. Honnêtement, vu son comportement assez sale, je ne recommande pas d’utiliser les nombre aléatoire de la bibliothèque standard du C++.

+0 -0

Cette solution est bien connue, c’est ce que j’ai toujours fait en C. Mais comme là je me mets au C++17[^plus], je voulais faire ça proprement (je viens de voir une vidéo qui explique par A+B que la méthode habituelle avec srand(time(0)) et le modulo sont à "vomir").

louk

Donc tu n’as pas lu le lien. Pas de srand ou de modulo dedans.

Honnêtement, vu son comportement assez sale, je ne recommande pas d’utiliser les nombre aléatoire de la bibliothèque standard du C++.

Gabbro

Si tu fais des stats, type Monte-Carlo, je mets dans les applications critiques. Tu as une forte dépendance à la qualité des générateurs aléatoires. C’est un problème classique de l’utilisation des générateurs pseudo-aléatoires, pas vraiment un problème de "saleté" des générateur du C++. (Si le C++ s’amuse à donner plusieurs algos, ce n’est pas pour rien).

+0 -0

@gbdivers : non, j’avoue l’avoir survolé. Mais je répondais à Gabbro en fait, qui disait "Honnêtement, vu son comportement assez sale, je ne recommande pas d’utiliser les nombre aléatoire de la bibliothèque standard du C++".

+0 -0

J’ai essayé de build Boost mais j’y arrive pas, j’ai des erreurs que je ne comprends pas. Par contre, j’ai essayé sur Linux sans Boost et en effet, ça marche.

Conclusion : coder sur Linux, sinon avec VisualStudio sur Windows.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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