Signaler

Tirage successif sans remise en C

Posez votre question Kamikaz25 - Dernière réponse le 19 juil. 2017 à 14:04 par 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.
Afficher la suite 
Utile
+1
plus moins
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.
Donnez votre avis
Utile
+1
plus moins
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é
yg_be 2821Messages postés lundi 9 juin 2008Date d'inscription ContributeurStatut 21 juillet 2017 Dernière intervention - 17 juil. 2017 à 12:39
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
Répondre
Donnez votre avis
Utile
+1
plus moins
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 );
   }
}
Kamikaz25- 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)
Répondre
Dalfab 254Messages postés dimanche 7 février 2016Date d'inscription 19 juillet 2017 Dernière intervention - 18 juil. 2017 à 10:19
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
Répondre
Kamikaz25- 18 juil. 2017 à 10:50
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 ?
Répondre
Dalfab 254Messages postés dimanche 7 février 2016Date d'inscription 19 juillet 2017 Dernière intervention - 19 juil. 2017 à 11:06
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()
.
Répondre
Kamikaz25- 19 juil. 2017 à 14:04
en effet. Je n'avais même pas vu que tu n'avais pas mis cette ligne :/ désolé j'aurais du le voir ^^

En tout cas je te remercie énormément du temps que tu m'a accorder. avec ceci je devrais pouvoir me débrouiller pour jeu. Je laisse encore le sujet ouvert (il faut quand même que je prenne 5 minutes pour voir si j'arrive à l'adapter.

Encore merci
Répondre
Donnez votre avis
Utile
+0
plus moins
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)
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !