Nombre aléatoire en C++

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

J’ai besoin du

#include <chrono>

Oui

donc mon code serait

#include <chrono>
#include <iostream>

int main
{
     auto seed = std::chrono::system_clock::now().time_since_epoch().count();
     std::mt19937 engine {seed};
     
     return 0;
}

?

valerian.roura

Il t’en manque une partie là. Tu crées le générateur, mais tu ne t’en sers pas. Les deux lignes de LaVirgule remplacent les lignes 7 et 8 sur ce code.

Programmer, ce n’est pas juste copier/coller des trucs tout faits, il faut réfléchir au sens du code que l’on écrit. Sinon, on ne progresse pas.

+4 -0

Mais le code

#include<iostream>
#include<chrono>

using namespace std;

int main()
{
    auto seed = std::chrono::system_clock::now().time_since_epoch().count();
    std::mt19937 engine {seed};
    std::uniform_int_distribution<> distrib(1, 6);
    double NbAlea (distrib(gen));
    std::cout << NbAlea;
    return 0;

}

ne compile pas, ça me met l’erreur à la ligne 9 : mt19937 is not a member of 'std'

Salut,

Quand tu obtiens une erreur, c’est un bon réflexe de chercher cette erreur sur un moteur de recherche pour essayer de la comprendre et de trouver une solution. En faisant cela, tu devrais trouver la solution à ce problème.

+1 -0

Edit : ça a réglé le problème mais maintenant à la ligne 12 ça met : 'gen' was not declared in this scope

Vraiment, il ne faut pas copier/coller au pif le code… Comment déclarais tu gen dans ton code précédent ? Qu’est-ce que cette ligne est devenue dans ton nouveau code ?

+1 -0

Prends ton temps.

Je vous deux solutions, soit rajouter la ligne

std::mt19937 gen(rd))

Tu crées déjà un std::mt19937, pourquoi en créer un deuxième? Et si rd ne fonctionnait pas avant (et qu’en plus tu ne le crées plus maintenant…), pourquoi subitement il se mettrait à produire des nombres aléatoires comme tu le souhaites ?

soit remplacer

    double NbAlea (distrib(gen));

par

    double NbAlea (engine);

valerian.roura

Dans ton nouveau code, engine remplace gen directement, tu fais quoi du distrib ?… Je pense qu’il est vraiment important que tu prennes ton temps pour te poser et comprendre ce que tu as écrit. Si tu bricoles en essayant des trucs un peu au petit bonheur la chance, il y a peu de chances que ça marche…

+3 -0

J’ai besoin du

#include <chrono>

donc mon code serait

#include <chrono>
#include <iostream>

int main
{
     auto seed = std::chrono::system_clock::now().time_since_epoch().count();
     std::mt19937 engine {seed};
     
     return 0;
}

?

valerian.roura

Tu sais, tu peux essayer tes modifications en compilant et exécutant de ton côté pour voir si c’est concluant. Tu n’as pas besoin de demander notre approbation à chaque fois. C’est pas comme si chaque essai était payant ou bien que ta machine risquait d’exploser à la moindre erreur ! :lol:

+0 -0

Essaie ça :

NbAlea (distrib(gen));
std::cout << NbAlea;
NbAlea (distrib(gen));
std::cout << NbAlea;
NbAlea (distrib(gen));
std::cout << NbAlea;

Normalement, tu vas constater que le programme affiche des nombres qui changent. Le programme a une série de nombres en réserve qui simulent très bien une série aléatoire. Ton problème est qu’il va piocher systématiquement au même endroit dans cette série.

Il faut donc une commande au début pour dire 'Va chercher dans un endroit 'aléatoire' dans cette série’. Mais pour prendre un endroit aléatoire, comment faire ? La technique que tout le monde utilise, c’est de s’appuyer sur l’horloge de l’ordinateur. Au moins, on est sûr qu’entre 2 lancers, l’horloge va nous donner 2 nombres différents.

Ici, tu veux un seul nombre. On va beaucoup simplifier ton problème. Il y a des outils spécialisés pour générer une série de nombres 'aléatoires’ (les outils ci-dessus), mais toi, tu veux un seul nombre.

Tu demandes à ton ordinateur quelle heure est-il ? Ton ordinateur te donne un nombre, un nombre de milli-secondes ; Ce nombre, tu le divises par 6, et tu regardes le reste de la division. Et ce nombre va 'ressembler' à un nombre aléatoire.

C’est un countournement, c’est pas terrible, mais pour ton besoin, c’est bien suffisant.

Comment faire pour ça ? Tu relis la discussion, la solution a déjà été donnée pour récupérer l’heure (en milli-secondes ou centièmes de secondes, je ne sais pas trop, il y a peut-être un piège à éviter ici).

Et pas la peine de remonter très loin, c’est assez récent. Ensuite, trouver le reste de la division par 6 … personnellement je ne connais pas la syntaxe en C++.

ça me retourne à nouveau 4

valerian.roura

Oublie la proposition d’elegance, utiliser uniquement l’heure est une mauvaise idée car non généralisable à des besoins différents mais similaires. Quel est l’état courant de ton code qui continue de te renvoyer 4 ?

+0 -0

J’ai repris l’ancien code qui est :

#include <iostream>
#include <random>


int main()
{
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> distrib(1, 6);
    double NbAlea(distrib(gen));
    std::cout << NbAlea;
    return 0;
}

mais cette fois sur l’IDE Visual Studio 2019 et le code marche parfaitement, le nombre est bien aléatoire. En tout cas merci à tout ceux qui m’ont aidé, je pense à toi @adri1 (qui a bien fait de ne pas me donner un code tout fait), @jo_link_noir qui m’a fait changé d’IDE et à tout les autres :). Ce sujet est maintenant clos

+4 -0
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