Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 9 sur 9
  1. #1
    Invité de passage
    Inscrit en
    octobre 2012
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : octobre 2012
    Messages : 4
    Points : 0
    Points
    0

    Par défaut generateur de nombre aleatoire(jeu du black jack)

    Bonjour,

    Je dois écrire un code dans lequel il me faut créer une fonction qui va générer des nombres aléatoires. Le problème c'est :
    aléatoires

    -qu'elle doit utiliser des paramètres d’entrées et de sorties.

    -Elle doit afficher aléatoirement le nom d'une carte et sa valeur

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // Données utilisées par le programme:
    char Cartes[13] = { 'A', '2', '3', '4', '5', '6', '7', '8', '9', 'X', 'V', 'D', 'R' } ;
    short Valeurs[13] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10 } ;
    
    // Générateur de cartes
    
    short genererCarte( char cartes[], short valeurs[], char &carte, short &points )
    {
    Ici je ne vois pas comment faire. Je ne sais meme pas par ou commencer. Est ce que je dois declarer mo tableau ici? Comment utliser les parametres d entres et sorties??
    }

    Aussi dans le main, on doit creer un premier fichier qui affiche les 100 premieres pairse générées aleatoirement par la fonction et un deuxieme fichier qui affiche les 500 autres.

    Comment faire pour que il y en ai 100? Si on utlise le for, il comptabilise 100 fois de suite la meme valeur. Je suis COM--PLE-TE-MENT PAUMEE. Je debute a peine au fait.


    Merci pour ce qui prendrons le temps de me repondre au plus vite...

  2. #2
    Membre émérite
    Inscrit en
    décembre 2008
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : décembre 2008
    Messages : 532
    Points : 801
    Points
    801

    Par défaut

    Ce code devrait générer 100 indices aléatoires de 'Cartes' et 'Valeurs' :
    Code :
    1
    2
    3
    4
    5
    for (int i=0; i<100; ++i) 
    {
        int randomIndex = std::rand() % 13; // pour un tableau de taille 13
        std::cout << randomIndex << std::endl;
    }
    Si tu veux quelque chose de non-déterministe (séquences d'indices différentes d'une exécution à l'autre) tu peux utiliser std::srand d'une manière similaire (cf l'exemple du lien).

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro Loïc Joly
    Développeur informatique
    Inscrit en
    août 2004
    Messages
    4 929
    Détails du profil
    Informations personnelles :
    Nom : Homme Loïc Joly
    Âge : 39
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : août 2004
    Messages : 4 929
    Points : 11 071
    Points
    11 071

    Par défaut

    Au black-jack, on ne génère pas des cartes aléatoirement, mais on bat les cartes de n paquets (ainsi, si 4*n rois sont déjà tombés, on sait qu'il ne peut pas en tomber d'autres). Je te conseille donc de générer un tableau avec tes n paquets, puis d'utiliser std::random_shuffle pour les mélanger.

  4. #4
    Invité de passage
    Inscrit en
    octobre 2012
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : octobre 2012
    Messages : 4
    Points : 0
    Points
    0

    Par défaut

    Citation Envoyé par cob59 Voir le message
    Ce code devrait générer 100 indices aléatoires de 'Cartes' et 'Valeurs' :
    Code :
    1
    2
    3
    4
    5
    for (int i=0; i<100; ++i) 
    {
        int randomIndex = std::rand() % 13; // pour un tableau de taille 13
        std::cout << randomIndex << std::endl;
    }
    .
    Ok j'ai essayé d'appliquer le rand dans mon code mais je ne comprends pas pourquoi, il n'affiche que nom de la carte A et sa valeur 1. 100 fois de suite...

    Code :
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    #include<iostream>
    #include<time.h>
    #include<fstream>
    using namespace std;
     
    // Générateur de cartes
     
    short genererCarte( char cartes[], short valeurs[], char &carte, short &points )
    {
    	int i =0;
     
    for (int i=0; i<13; i++)            
    {
    	rand(); }
     
     
    	carte  = cartes[i] ;
    	points = valeurs[i] ;
    	return rand() ;
    }
     
     
    int main()
     
    {
     
    	char  Cartes[13]  = { 'A', '2', '3', '4', '5', '6', '7', '8', '9', 'X', 'V', 'D', 'R' } ;
    	short Valeurs[13] = {  1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  10,  10,  10  } ;
     
    	// Rendre le comportement du programme un peu plus aléatoire
    	srand( unsigned int (time( NULL ) ) ) ; 
     
    	short mesPoints ;
    	char  maCarte ;
    	short monIndice ;
     
    	monIndice = genererCarte( Cartes, Valeurs, maCarte, mesPoints ) ;
     
     
    	//Generer 100 fois
     
    for (int i=0; i<100; i++) 
    {
     
    	cout << "Les resultats sont :" << endl ;
    	cout << "     Carte  = " << maCarte << "     Points = " << mesPoints << endl ;
    }
     
     
    	//fichier carte.text
     
    ifstream fichier("carte.txt", ios::in);  // on ouvre
     
            if(fichier)
            {
     
     
                    fichier.close();//on ferme
            }
            else
                    cerr << "Impossible d'ouvrir le fichier !" << endl;
     
    	system("pause");
    	return 0;}
    Comment stocker 100 valeurs dans un fichiers?

    j

  5. #5
    Invité de passage
    Inscrit en
    octobre 2012
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : octobre 2012
    Messages : 4
    Points : 0
    Points
    0

    Par défaut

    Citation Envoyé par JolyLoic Voir le message
    Au black-jack, on ne génère pas des cartes aléatoirement, mais on bat les cartes de n paquets (ainsi, si 4*n rois sont déjà tombés, on sait qu'il ne peut pas en tomber d'autres). Je te conseille donc de générer un tableau avec tes n paquets, puis d'utiliser std::random_shuffle pour les mélanger.
    Tu dois avoir raison en ce qui concerne les regles du black jack mais la premiere partie de l'exo concerne ce geenrateur de cartes. Les melanges c'est apres. Merci quand meme de l'indication.

  6. #6
    Membre Expert
    Homme Profil pro
    Chercheur
    Inscrit en
    mars 2010
    Messages
    1 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : mars 2010
    Messages : 1 179
    Points : 1 532
    Points
    1 532

    Par défaut

    Bonjour,

    personnellement, je génèrerais dans un premier temps toutes les paires possibles dans un tableau unidimensionnel puis j'effectuerais des permutations aléatoires de ce tableau pour obtenir des tirages aléatoires. C'est très facile à mettre en place et à manipuler. Par ailleurs, je pense que tu gagnerais à stocker également les couleurs et à faire un peu de programmation objet, soit en faisant une classe "Carte" ou une classe "Jeu" correspondant à l'ensemble des cartes.

  7. #7
    Invité de passage
    Inscrit en
    octobre 2012
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : octobre 2012
    Messages : 4
    Points : 0
    Points
    0

    Par défaut

    Citation Envoyé par Aleph69 Voir le message
    Bonjour,

    personnellement, je génèrerais dans un premier temps toutes les paires possibles dans un tableau unidimensionnel puis j'effectuerais des permutations aléatoires de ce tableau pour obtenir des tirages aléatoires. C'est très facile à mettre en place et à manipuler. Par ailleurs, je pense que tu gagnerais à stocker également les couleurs et à faire un peu de programmation objet, soit en faisant une classe "Carte" ou une classe "Jeu" correspondant à l'ensemble des cartes.
    Bonjour Aleph69,

    je n'ai pas encore fait de programmation objet...
    Ce n'est pas possible d'obtenir des tirages aleatoires avec ce que j'ai fait en modifiant seulement certains trucs?

  8. #8
    Membre Expert
    Homme Profil pro
    Chercheur
    Inscrit en
    mars 2010
    Messages
    1 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : mars 2010
    Messages : 1 179
    Points : 1 532
    Points
    1 532

    Par défaut

    Si, bien sûr, ce n'était qu'une suggestion. Au moins l'un des problèmes vient de ton code :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    short genererCarte( char cartes[], short valeurs[], char &carte, short &points )
    {
    	int i =0;
            for (int i=0; i<13; i++)         
            {
    	      rand(); // génère un nombre aléatoire sans le stocker
            }
            // à la fin de la boucle, i=12
    	carte  = cartes[i] ;
    	points = valeurs[i] ;
    	return rand() ; // retourne finalement un nombre aléatoire, tout ce qui est écrit avant ne sert à rien sauf affectations de carte et points
    }
    Au vu des commentaires ajoutés, cela reviendrait au même d'écrire :
    Code :
    1
    2
    3
    4
    5
    6
    short genererCarte( char cartes[], short valeurs[], char &carte, short &points )
    {
            carte  = cartes[12] ;
    	points = valeurs[12] ;
    	return rand() ;
    }
    Dans un premier temps, sans t'occuper des détails du langage, essaye d'écrire correctement un algorithme en pseudo-code.

  9. #9
    Modérateur
    Avatar de koala01
    Profil pro Philippe Dunski
    Inscrit en
    octobre 2004
    Messages
    9 676
    Détails du profil
    Informations personnelles :
    Nom : Philippe Dunski
    Âge : 42

    Informations forums :
    Inscription : octobre 2004
    Messages : 9 676
    Points : 15 704
    Points
    15 704

    Par défaut

    Salut,

    Même sans aller jusqu'à faire de la programmation orientée objets, il serait franchement pas mal d'au moins faire de la programmation "orientée structures".

    L'idée serait, au moins, de regrouper "ce qui va bien" ensemble

    Ainsi, une carte se caractérise par (pour le black jack):
    1. une couleur
    2. une valeur (as, valet, dame roi)
    3. le nombre de points que cela rapporte
    En mettant ces trois caractéristiques dans une structure commune, tu pourras créer un tableau contenant autant de structures que tu le veux et te balader dans ce tableau, en étant sur que, quoi qu'il arrive, tu récupéreras toujours la couleur, la valeur et le nombre de points qui correspond à chaque carte particulière.

    Ce sera, très clairement, de nature à te faciliter grandement la vie

    Maintenant, pour ce qui concerne le tirage aléatoire en lui même:

    Le principe des nombres aléatoires se réparti entre deux fonctions :
    1. une fonction qui va "initialiser" le générateur de nombres : void srand(unsigned int)
    2. une fonction qui va générer les nombres eux-même : int rand()
    Le principe de rand est de renvoyer un nombre pseudo aléatoire, c'est à dire qu'il y a, malgré tout, un algorithme derrière qui va générer les valeurs.

    Or, aussi poussé puisse être cet algorithme, il n'en reste pas moins tout aussi prédictible que n'importe quel algorithme : si tu pars d'une situation précise au moment où tu fais appel à cet algorithme, tu obtiendras toujours le même résultat

    Ainsi, il semblerait, selon tes propres constatations, si tu n'initialise pas le générateur de nombre aléatoires, qu'il renverra toujours 1

    Tu dois donc veiller à initialiser le générateur de nombres, et là, tu as deux solutions:

    La première est de l'initialiser avec une valeur clairement définie, et tu auras la certitude d'obtenir les même tirages à chaque fois que tu lanceras ton application.

    Dans certains jeux, cette solution peut etre envisageable pour s'assurer que deux parties différentes commenceront de la même manière (s'il s'agit de générer des "ennemis" de manière aléatoire, par exemple), mais il faut avouer que, dans le cas d'un jeu de cartes, ce ne serait pas vraiment l'idéal

    La deuxième est de l'initialiser avec une valeur qui changera toujours, de manière à s'assurer qu'il n'y aura jamais deux parties identiques (ou, du moins, à s'assurer que si deux parties identiques venaient à apparaitre, elles apparaissent tellement éloignées les unes des autres que nous ne pourrions sans doute pas le remarquer).

    Il se fait que l'on a une fonction qui nous renvoie, justement, un entier qui change tout le temps : la fonction qui nous permet d'obtenir l'heure système : time(NULL).

    L'idéal est donc d'initialiser (une et une seule fois !!! ) le générateur de nombre aléatoires avec la valeur renvoyée par cette fonction, au début de ton application, de manière à ce que la boucle qui fera appel au générateur de nombres aléatoires obtienne à chaque fois des valeurs différentes

    En gros, cela se ferait sans problème dans la fonction main sous la forme de
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    int main()
    {
        srand(time(NULL));
         /* ... */
         genererCarte(/* ... */);
         /*...*/
         return 0;
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •