Tirage successif sans remise en C

Résolu/Fermé
Kamikaz25 - 17 juil. 2017 à 09:28
 Kamikaz25 - 24 juil. 2017 à 15:56
Bonjour à tous.

Je suis en train de me plonger dans la programmation en C. et je voulais me crée un petit jeu de carte.

je suis confronter un problème qui et le tirage au sort successif sans remise. Mon jeu de carte comporte 54 cartes (juste un détail il pourrais en comporter 3 de tout façon je ne sais pas faire ^^) et j'aimerais donc que tirer au sort une carte mais qu'une fois tirer, elle ne puisse plus être retirer (le principe même du tirage au sort successif sans remise).

Je sais réaliser un nombre aléatoire avec srand() (je ne sais pas si je devrais par la suite l'utiliser) ainsi sur l'équation de récurrence pour mon problème : Le nombre de tirages successifs sans remise de p jetons parmi n est : (n)/(n-p).

pour précision, mes cartes sont sous forme de tableau :Cartes[ID de la carte compris en 1 et 54, type de carte,valeur] et donc il faudrait, je pense, que la fonction tire au sort un nombre en 1 et 54, puis l’enlève, et ensuite tire au sort un nombre entre 1 et 54 privé du chiffre précédemment tiré. Ce qui me permettrais ensuite grâce à l'ID de la carte de ne plus pouvoir la tirer.

En espérant que vous avez compris mon problème, je reste à votre disposition pour toute questions, ou précisions.

Cordialement.
A voir également:

4 réponses

Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
17 juil. 2017 à 17:36
On peut faire comme l'on ferait avec un 'vrai' jeu de cartes.
On a un jeu de 54 cartes que l'on mélange. Pour obtenir une carte, on prend la dernière du paquet. Pour avoir une autre carte sans remise, on prend la suivante, etc
#define NB_CARTES (4*13+2)

int jeuNeuf( unsigned char cartes[] ) {
   for ( unsigned char i = 0 ; i < NB_CARTES  ; ++i )
      cartes[i] = i; // les cartes comme les indices dans un tableau commencent à 0
   return NB_CARTES - 1;          // retourne l'indice prochaine carte
}

int melangerJeu( int cartes[] ) {
   for ( int i = 0 ; u < NB_CARTES ; ++i ) {
      int j = rand() % NB_CARTES;                // choix d'une position au hasard
      unsigned char tmp = cartes[i];             // échange de la carte à cette position
      cartes[i] = cartes[j];
      cartes[j] = tmp;
   }
   return NB_CARTES - 1;          // retourne l'indice prochaine carte
}

unsigned char carteSuivante( int cartes[] , int* pindice ) {
   return cartes[*(pindice--)];   // extrait la carte, et passe à l'indice suivant
}

int main() {
   unsigned char cartes[NB_CARTES];
   jeuNeuf( cartes );
   int indice = melangerJeu( cartes );
   while ( indice >= 0 ) {            // tirer toutes les cartes
      int carte = carteSuivante( cartes , &indice );
      printf( "carte tiree : %u\n" , carte );
   }
}
4
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
17 juil. 2017 à 17:51
super idée, aléatoire, et plus simple à programmer que piocher dans les cartes restantes.
petite faute de frappe: "u" en ligne 11.
0
Kamikaz25 > yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024
18 juil. 2017 à 09:49
Je n'ai pas tout compris au code, alors j'ai copier coller ton programme (au "u" pres) et la console me renvois un 0 tout le temps. Du coup cela ne m'a pas aider à comprendre ton bout de code. Mais pour rapel : mes cartes sont défefinit en tableau a deux dimensions. avec donc 54 lignes et la premiere colone correspondant au numéros de la carte ( de 1 à 54) dois-je continuer a faire comme ceci ? Je suis désolé je n'arrive pas à comprendre. ca fait 1 semaines que je nage totalement pour ce tirage au sort. Je n'arrive pas éclaircir ce mystère (pourtant je suis assez bon en math mais la mon cerveau refuse de travailler je pense)
0