Eviter les doublons avec la fonction rand()
Répondre à la discussion
Affichage des résultats 1 à 9 sur 9

Eviter les doublons avec la fonction rand()



  1. #1
    invite03ec6464

    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
    invite2d7144a7

    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
    invite03ec6464

    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
    invite895675d5

    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
    invite03ec6464

    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
    invite2d7144a7

    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
    invite895675d5

    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
    inviteb9f49292

    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 invite99edbd85 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 invitef634365f dans le forum Habitat bioclimatique, isolation et chauffage
    Réponses: 11
    Dernier message: 22/05/2009, 06h55
  3. Eviter Les Migraines
    Par inviteeaab1f50 dans le forum Santé et médecine générale
    Réponses: 3
    Dernier message: 23/04/2008, 18h02
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...