Répondre à la discussion
Affichage des résultats 1 à 9 sur 9

Eviter les doublons avec la fonction rand()



  1. #1
    pacifiste95

    Eviter les doublons avec la fonction rand()


    ------

    Salut a tous,

    j'ai un code qui génère des cartes de jeu (poker), aléatoirement, mais parfois j'ai des cartes en double

    Pour le premier tirage tout va bien, j'ai réussi a contourner ce problème en utilisant :

    Code:
    void  tirage1(card *main) 
    { 
     int i=0; 
     int j=0; 
     int compteur = 0; 
      
     for(i=0, j = 1; i < 5; ) 
     { 
      main[i].color= (rand()%4) + 1; 
      main[i].value= (rand()%13)+ 2; 
    
      if (i > 0) 
       for (j = 0; j < i ; j++) 
        if (main[i].color == main[j].color && main[i].value == main[j].value) // contre mesure pour eviter les doublons 
        
         { 
          j = -1; 
          break; 
         } 
      if (j > 0) 
       i++; 
     } 
    
    }
    ça fonctionne bien, mais pour le deuxième tirage j'ai des soucis, je sais pas comment faire, voici mon code :

    <
    Code:
    void tirage2(card *main) 
    { 
     int p=0; 
     int i=0; 
      int j=1; 
     char choix[6]; 
     printf("Appuyez sur o pour garder ou n pour retirer\n\n"); 
     for (p=1, i=0, j = 1; p<6,i < 5; p++) 
     { 
      printf("Voulez vous garder votre %de carte?\n", p); 
      scanf("%s", &choix[p-1]); 
      if (choix[p-1] == 'o' ) 
      { 
      } 
      else 
      { 
       main[p-1].color= (rand()%4) + 1; 
       main[p-1].value= (rand()%13)+ 2; 
      } 
     } 
     choix[5] = '\0'; 
    }
    Merci de m'aider !

    -----

  2. #2
    whoami

    Re : Eviter les doublons avec la fonction rand()

    Bonjour,

    Il faut faire un tableau de booléens, avec une case par carte.

    Au début, on met tout à false.

    Ensuite, on entre dans une boucle faisant. :
    * répéter

    - tirer une carte.
    - est-elle déjà tirée
    --- OUI => retour tirage carte
    --- NON => la marquer tirée, traiter

    * jusqu'à ce que toutes les cartes soient tirées.

  3. #3
    pacifiste95

    Re : Eviter les doublons avec la fonction rand()

    le problème c'est que je vais devoir modifier tout mon programme si je fais ce que tu dis...

    j'aimerais une contre mesure inspiré du premier tirage, mais j'arrive pas a la mettre en place.

    Merci d'avance

  4. #4
    bzh_nicolas

    Re : Eviter les doublons avec la fonction rand()

    Il faut, quand tu refais le tirage d'une carte quand le joueur ne la garde pas, revérifier dans ton tableau "main" si elle n'est pas déjà tiré ; comme tu le fais au premier tirage.
    tant que carte existe dans main
    ..tirage carte au hasard
    ..vérification si la carte existe dans main
    fin tant que

  5. A voir en vidéo sur Futura
  6. #5
    pacifiste95

    Re : Eviter les doublons avec la fonction rand()

    J'ai essayé de faire comme au premier tirage mais cela ne fonctionne pas...

    Code:
    void tirage2(card *main) 
    { 
     int p=0; 
     int i=0; 
      int j=1; 
     char choix[6]; 
     printf("Appuyez sur o pour garder ou n pour retirer\n\n"); 
     for (p=1; p<6 ;p++) 
     { 
      printf("Voulez vous garder votre %de carte?\n", p); 
      scanf("%s", &choix[p-1]); 
      if (choix[p-1] == 'o' ) 
      { 
      } 
      else 
      { 
    for(i=0, j = 1; i < 5; ) 
     { 
      main[i].color= (rand()%4) + 1; 
      main[i].value= (rand()%13)+ 2; 
    
      if (i > 0) 
       for (j = 0; j < i ; j++) 
        if (main[i].color == main[j].color && main[i].value == main[j].value) // contre mesure pour eviter les doublons 
         { 
          j = -1; 
          break; 
         } 
      if (j > 0) 
       i++; 
     } 
    
      } 
     } 
     choix[5] = '\0'; 
    }

  7. #6
    whoami

    Re : Eviter les doublons avec la fonction rand()

    Bonjour,
    Citation Envoyé par pacifiste95 Voir le message
    le problème c'est que je vais devoir modifier tout mon programme si je fais ce que tu dis...
    Ben oui, c'est ça aussi la programmation, il faut savoir reprendre tout un programme quand on veut le faire évoluer.
    Très souvent, une refonte complète fait finalement gagner du temps par rapport à l'ajout de rustines au coup par coup.

  8. #7
    invite765732342432
    Invité

    Re : Eviter les doublons avec la fonction rand()

    Sans vouloir être désagréable, ton code est vraiment mal foutu (en particulier le for sans incrément, le "if (i > 0)" inutile, ...)

    Les meilleurs conseils possibles t'ont déjà été donnés. En particulier: un tableau des cartes tirées.
    Tu en auras besoin dès que tu feras intervenir une deuxième main ou la possibilité de jeter des cartes.

    Profites en également pour créer une fonction séparée qui détermine seule si une carte a déjà été tirée. Tu pourras ainsi rendre ton code beaucoup plus compréhensible et le faire marcher plus facilement.

  9. #8
    bzh_nicolas

    Re : Eviter les doublons avec la fonction rand()

    Je vois des problèmes dans ton algo :
    "if (i>0)"
    Pourquoi ne vérifies-tu pas le premier tirage ?
    Ta première carte peut-être en double aussi.

    "for (j = 0; j < i ; j++)"
    Pourquoi t'arrêtes-tu à "i" ?
    Tu dois vérifier tout ton tableau main à chaque fois.
    Là tu ne vérifies rien au premier tour, 1 carte au 2ème, 2 ou 3ème, etc...

    P.S. : ton algo et ta structuration sont bizarre, tu utilisais quel langage avant C (ou info indus peut-être) ?

  10. #9
    lou_ibmix_xi

    Re : Eviter les doublons avec la fonction rand()

    Deux remarques supplémentaires:
    -je ne vois pas d'appel à "srand" pour initialiser le générateur pseudo-aléatoire
    -utiliser "main" pour autre chose que le point d'entrée de ton programme est quand même dangereu

Discussions similaires

  1. Fonction rand
    Par miloy23 dans le forum Technologies
    Réponses: 3
    Dernier message: 27/07/2009, 14h16
  2. une idée pour éviter les ponts themiques en isolation par l'extérieur avec bardage
    Par doudou2rennes dans le forum Habitat bioclimatique, isolation et chauffage
    Réponses: 11
    Dernier message: 22/05/2009, 06h55
  3. Actu - Une biopuce pour éviter les tests sur les animaux
    Par RSSBot dans le forum Commentez les actus, dossiers et définitions
    Réponses: 6
    Dernier message: 26/09/2008, 12h31
  4. Eviter Les Migraines
    Par SOURIS91 dans le forum Santé et médecine générale
    Réponses: 3
    Dernier message: 23/04/2008, 18h02
  5. Actu - Des robots pour éviter les tests sur les animaux
    Par RSSBot dans le forum Commentez les actus, dossiers et définitions
    Réponses: 2
    Dernier message: 18/02/2008, 23h14
Découvrez nos comparatifs produits sur l'informatique et les technologies.