Tirage successif sans remise en C
Résolu
Kamikaz25
-
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.
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:
- Tirage au sort google sheet
- Google maps satellite - Guide
- Dns google - Guide
- Google maps - Guide
- Google photo - Télécharger - Albums photo
- Créer un compte google - Guide
4 réponses
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
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 ); } }
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.
après avoir retiré la première carte, tu pourrais alors tirer au sort un nombre entre 1 et 53.
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)
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)
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
je l'ai modifier en :
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é
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é
petite faute de frappe: "u" en ligne 11.
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
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 ?
Il faut initialiser le générateur aléatoire avec une semence aléatoire.
Par exemple ajouter dans le début du .