Tirage successif sans remise en C

Résolu
Kamikaz25 -  
 Kamikaz25 -
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   Statut Membre Dernière intervention   101
 
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 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
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 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
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
Dalfab Messages postés 706 Date d'inscription   Statut Membre Dernière intervention   101 > Kamikaz25
 
J'ai écris le code un peu vite.
Ligne 9, erreur de type : int melangerJeu( unsigned char cartes[] )
Ligne 10, il faut plutôt : for ( int i = 0 ; i < NB_CARTES ; ++i ) {
Ligne 20, erreur de type : unsigned char carteSuivante( const unsigned char cartes[] , int* pindice ) {
Ligne 21, erreur sur la parenthèse, il faut plutôt : return cartes[(*pindice)--];

Ça devrait marcher
0
Kamikaz25 > Dalfab Messages postés 706 Date d'inscription   Statut Membre Dernière intervention  
 
Oui en effet, avec ce correctif, ton programme fonctionne. Je vais me pencher dessus pour le comprendre et tenter de l'appliquer à mon problème.

En tout cas cette méthode me plait un peu plus que la première proposé, désolé yg-be (j'ai quand même essayer ta méthode j'avais presque réussis ce que je voulais, j'avais juste un problème lors de la deuxième pioche).

je vous remercie pour le moment de votre rapidité et de votre efficacité à tous les deux

PS : j'ai l'impressions que ton code fourni toujours la même série de tirage, donc pas aleatoire... est ce normal ?
0
Dalfab Messages postés 706 Date d'inscription   Statut Membre Dernière intervention   101 > Kamikaz25
 
Tel quel, le code fournit toujours la même liste.
Il faut initialiser le générateur aléatoire avec une semence aléatoire.
Par exemple ajouter
srand(time(NULL));
dans le début du
main()
.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonjour, quand tu as tiré une carte, tu pourrais la déplacer à la fin de ton tableau, et faire le tirage au sort parmi les cartes du début du tableau.
après avoir retiré la première carte, tu pourrais alors tirer au sort un nombre entre 1 et 53.
1
Kamikaz25
 
Bonjour et merci de ta réponse rapide.

Alors oui, ce n'est pas une mauvaise idée en sois. il faudrait juste que je regarde comment déplacer un nombre dans un tableau. (je m'attendais pas a ce genre de solutions a vrai dire ^^ mais si cela fonctionne alors pourquoi pas)
0
Kamikaz25
 
N'ayant pas trouver la fonction editer, je me permet de faire un double post.

j'ai du mal avec ta solution (je suis un peu un novice). j'ai un tableau 2 dimensions et j'ai tenter de m'inspirer de ceci pour mon programme

#include <stdio.h>
#include <stdlib.h>

#define MAX 5

int main(void)
{
int i = 0;
int n = 0;
int j = 0;
int k = 0;
int t[5]={23,78,1,8,9};

printf("\nNombre a supprimer? \n");
scanf("%d", &n);


for(i=0; i<5; i++ )
{
if( t[i]==n)
{
for(j=i; j < MAX; j++)
{
if( j < MAX-1)
{
t[j] = t[j+1];
}
else
{
t[j] = 0;
}
}
}
}

for(i=0; i < MAX-1; i++ )
printf("%d\n", t[i]);


system("PAUSE");
return 0;

}


je l'ai modifier en :

main()
{
int ii = 0;
int jj = 0;
int i = 0;
int n = 0;
int j = 0;
int t[5][3]= {{1,1,2},
{2,1,3},
{3,1,4},
{4,1,5},
{0,0,0}};

for(ii=0;ii<5;ii++)
{
for(jj=0;jj<3;jj++)
{
printf(" %d ", tests[ii][jj]);
}
printf("\n");
}
printf("\nNombre a supprimer? \n");
scanf("%d", &n);

printf("\n");
for(i=0; i<5; i++ )
{
if( t[i][0]==n)
{
for(j=i; j < 5; j++)
{
if( j < 5-1)
{
for(k=0;k<3;k++)
{
t[j][k] = t[j+1][k];
}
}
else
{
for(k=0;k<3;k++)
{
t[j][k] = 0;
}

}
}
}
}

for(ii=0;ii<5-1;ii++)
{
for(jj=0;jj<3;jj++)
{
printf(" %d ", tests[ii][jj]);
}
printf("\n");
}
}


Mais lorsque j’exécute j'obtient le même tableau (excepté la dimension)

ps: si des initialisations de variables manque c'est possible je voulais pas copier tout mon programme pour une question de visibilité
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
si tu essaies de déplacer une carte, je pense que c'est plus simple de faire ainsi:
- la première fois, tu échanges la carte tirée avec la carte 54
- la seconde fois, tu échanges la carte tirée avec la carte 53
- et ainsi de suite
0