IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Problème random et switch


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut Problème random et switch
    Bonjour à tous
    Ce matin en levant m'est venu une grande idée réaliser un Mastermind, je prend donc un crayon un papier et je pose mon algo, je me lance devant mon ordi et c'est parti.
    Toute cette intro pour dire que je suis bloqué sur un bête random et un switch qui font des trucs bizarres.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    #include <iostream>
    #include <time.h>
     
    using namespace std;
     
    void randcouleur();
     
    int essai [11] [3];
    int solution [3];
     
    int tourrandom=0;
     
    int main()
    {
        srand(time(NULL));
        cout << "Mastermind" << endl;
        cout << "Lancement de la séquence d'initialisation" << endl;
        randcouleur();
     
        return 0;
    }
    void randcouleur()
    {
        cout << "Initialisation" << endl;
        while (tourrandom < 4)
        {
            int random = 1 + (int)((double)rand() / ((double)RAND_MAX + 1) * 5);
     
            cout << random <<endl;
            cout << tourrandom <<endl;
            solution[tourrandom] = random;
            tourrandom++;
            cout << tourrandom <<endl;
            cout <<"ici"<<endl;
        }
        cout << solution[0] << solution[1] << solution[2] << solution[3] <<endl;
    }
    Le problème est que à l'utilisation le programme me sort toujours 2 en premier chiffre, ensuite 2 nombres aleatoire, puis le dernier chiffre est une enigme car si il me sort 5 il inscrira 6

    Un des résultats que je viens d'obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    2
    0
    1
    ici
    3
    1
    2
    ici
    5
    2
    3
    ici
    2
    3
    3
    ici
    5
    3
    6
    ici
    2356
    Intrigants non ?
    Je me doute que j'ai dû faire une erreur .... donc soyez indulgents, please.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    Points : 248
    Points
    248
    Par défaut
    j'ai pas tous regardé mais ça vient peut être du fais que tu déclares :
    donc un tableau avec 3 cases.
    Mais que tu le manipule comme un tableau avec 4 cases.

    EDIT :
    J'ai testé et a priori c'est bien ça, tu bidouille hors de ton tableau et ça crée des comportements indéfinis.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci
    Effectivement cela résout le problème du dernier chiffre, mais toujours pas celui du premier chiffre qui ne change pas d'une simulation à une autre.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    Points : 248
    Points
    248
    Par défaut
    Citation Envoyé par Lord Nazdar Voir le message
    Merci
    Effectivement cela résout le problème du dernier chiffre, mais toujours pas celui du premier chiffre qui ne change pas d'une simulation à une autre.
    exact j'avoue ne pas comprendre pourquoi mais le premier rand() me donne un chiffre dans les 31000 qui augmente un peu à chaque exécution..

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par atttchoum Voir le message
    exact j'avoue ne pas comprendre pourquoi mais le premier rand() me donne un chiffre dans les 31000 qui augmente un peu à chaque exécution..
    étrange car pour moi ce chiffre est 5

  6. #6
    Invité
    Invité(e)
    Par défaut
    J'ai remarqué que le premier chiffre prend la valeur maximal (j'ai changé pour 8 au lieu de 5)
    EDIT : en faite non

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    Points : 248
    Points
    248
    Par défaut
    Citation Envoyé par Lord Nazdar Voir le message
    étrange car pour moi ce chiffre est 5
    la variable random oui mais j'ai testé la valeur de retour de la fonction rand() et elle me renvoyais toujours dans les 31000.
    Maintenant elle a atteint le RAND_MAX et est redescendus à 500 et continu d'augmenter régulièrement.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Je pense que le problème est résolu, quand on lance plusieurs fois la boucle randcouleur le premier chiffre change, je ne met pas en résolu car si je croise d'autre problèmes je saurais ou poser mes questions.
    Merci

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    Points : 248
    Points
    248
    Par défaut
    Citation Envoyé par Lord Nazdar Voir le message
    Je pense que le problème est résolu, quand on lance plusieurs fois la boucle randcouleur le premier chiffre change, je ne met pas en résolu car si je croise d'autre problèmes je saurais ou poser mes questions.
    Merci
    Le problème est contourné plutôt. Si une âme charitable peut nous expliquer ce phénomène elle est la bienvenue

  10. #10
    Membre actif

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Points : 206
    Points
    206
    Par défaut
    Dis moi si je me trompe, mais dans :

    2
    0
    1
    ici
    3
    1
    2
    ici
    5
    2
    3
    ici
    2
    3
    3
    ici
    5
    3
    6
    ici

    2356
    les 2 parties en rouges ne me semblent pas très cohérentes :

    Peut tu m'indiquer s'il s'agit d'une erreur de recopie ou est-ce quelque chose que je n'arrive pas a expliquer ?

    De plus, je suis un peu douteux du

    int random = 1 + (int)((double)rand() / ((double)RAND_MAX + 1) * 5);
    Pour moi, l'algo serait plutot : int random = rand()%NB_RESULTAT_DIFFERENT_POSSIBLES + NB_MIN

    Donc, si tu a 5 couleurs :

    int random = rand()%5+1 (ce qui te génèrera des nombres compris entre 1 et 5).

    Après quelques tests, il est clair que ton algo que s'est ton algo de nombre génératoire qui cause ce problème. Plus que sa, je ne peux pas dire.

    Je te donne tout de même un moyen de rendre ton code plus lisible, propre, ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    #include <iostream>
    #include <time.h>
     
    using namespace std;
     
     
    enum Couleurs{VERT,ROUGE,BLEU,JAUNE,VIOLET};//Tu peux rajouter d'autres couleurs après
    Couleurs* randcouleur();
    int main()
    {
        srand(time(NULL));
        cout << "Mastermind" << endl;
        cout << "Lancement de la séquence d'initialisation" << endl;
        Couleurs * couleurs_mysteres=randcouleur();
        cout << couleurs_mysteres[0] << couleurs_mysteres[1] << couleurs_mysteres[2] << couleurs_mysteres[3] <<endl;
        //L'enum te permet de faire des choses comme :
        int nb_jaunes=0;
        for(int i=0;i<4;i++)
            if(couleurs_mysteres[i]==JAUNE)
                nb_jaunes++;
        cout<<"Il y a "<<nb_jaunes<<" jaune";
        return 0;
    }
    Couleurs* randcouleur()
    {
        cout << "Initialisation" << endl;
        int tourrandom=0;
        Couleurs random;
        Couleurs*solution=new Couleurs[4];
        while (tourrandom < 4)
        {
            random=static_cast<Couleurs>(rand()%5);
            solution[tourrandom] = random;
            tourrandom++;
        }
        return solution;
    }

  11. #11
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Pour moi, l'algo serait plutot : int random = rand()%NB_RESULTAT_DIFFERENT_POSSIBLES + NB_MIN
    On n'utilise *jamais* % avec le résultat de rand().


    De la bonne lecture :
    http://www.bourguet.org/v2/clang/random/
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    Points : 248
    Points
    248
    Par défaut
    Citation Envoyé par NoIdea Voir le message
    les 2 parties en rouges ne me semblent pas très cohérentes :

    Peut tu m'indiquer s'il s'agit d'une erreur de recopie ou est-ce quelque chose que je n'arrive pas a expliquer ?
    il y avait une dépassement sur son tableau.

    Pour moi, l'algo serait plutot : int random = rand()%NB_RESULTAT_DIFFERENT_POSSIBLES + NB_MIN
    Comme l'a dis Goten, il faut éviter d'utiliser les modulo, même si ici ça aura peu d'influence.

    Le problème est toujours le même cependant, le premier rand() donne toujours des valeurs très proches qui augmentent petit à petit.
    Quelqu'un aurai une explication ?

  13. #13
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par atttchoum Voir le message
    Le problème est toujours le même cependant, le premier rand() donne toujours des valeurs très proches qui augmentent petit à petit.
    Peut être parce que srand(time(NULL)) et donc time(NULL) ne varie pas beaucoup avec le temps. Pour info, le résultat de time(NULL) est incrémenté de 1 toutes les secondes.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    Points : 248
    Points
    248
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Peut être parce que srand(time(NULL)) et donc time(NULL) ne varie pas beaucoup avec le temps. Pour info, le résultat de time(NULL) est incrémenté de 1 toutes les secondes.
    Certes, mais la suite qui génère les nombres pseudo-aléatoire n'est-elle pas sensée donner des nombres complètement différents lorsque la graine varie ? (d'ailleurs les nombres générés après le premier rand() sont, eux, complètement différent)

  15. #15
    Nouveau membre du Club
    Inscrit en
    Janvier 2010
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 44
    Points : 28
    Points
    28
    Par défaut
    ton problème viens de la façon dont tu utilise random :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include <time.h>
    srand(time (0));
    Solution = 0+rand()%10
    0 la variable de départ et 10 pour indiquer que le chiffre aléatoire peut aller jusqu'a 10 normalement ça marche.

    par contre l'initialisation je sais pas si avec NULL ça ne pose pas un soucis pour srand time. j'espère que tu arriver à faire marcher tonprogramme


    je suis d'accord avec le dernier post de atchoumm

Discussions similaires

  1. problème de case/switch
    Par nicolas.sitbon dans le forum C
    Réponses: 5
    Dernier message: 22/09/2007, 21h00
  2. Problème de boucle Switch Case
    Par mLk92 dans le forum Langage
    Réponses: 4
    Dernier message: 14/06/2007, 17h20
  3. problème avec un switch
    Par Tobleron dans le forum Langage
    Réponses: 3
    Dernier message: 19/02/2007, 22h50
  4. Problème avec un switch contenant des strings
    Par dessinateurttuyen dans le forum Langage
    Réponses: 6
    Dernier message: 18/07/2006, 12h56
  5. Problème dans un "switch"
    Par belzeluc dans le forum C++
    Réponses: 4
    Dernier message: 04/06/2006, 12h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo