Signaler

Tirage successif sans remise en C [Résolu]

Posez votre question Kamikaz25 - Dernière réponse le 24 juil. 2017 à 15:56 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.
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.
Cette réponse vous a-t-elle aidé ?  
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é
Cette réponse vous a-t-elle aidé ?  
yg_be 3367Messages postés lundi 9 juin 2008Date d'inscription ContributeurStatut 22 septembre 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 );
   }
}
Cette réponse vous a-t-elle aidé ?  
Dalfab 267Messages postés dimanche 7 février 2016Date d'inscription 19 septembre 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 267Messages postés dimanche 7 février 2016Date d'inscription 19 septembre 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
Kamikaz25- 24 juil. 2017 à 15:56
J'ai réussis à faire ce que je voulais (j'ai encore beaucoup à travailler sur le code mais je suis satisfait du tirage au sort de la carte (même si je pense que je devrais la mettre dans un tableau mais bon je verrais avec l'avancement de mon projet)

Je met donc ce sujet comme résolu. Et 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 !