Pileou face en C

Fermé
cracasbur - 19 févr. 2008 à 20:02
Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 - 19 févr. 2008 à 22:41
Bonjour,

alors moi je debute en C et je dois faire ceci : ecrire un programme où m. Riche et M.Pauvre jouent a pile ou face. M.Riche dispose de 1000 et M.pauvre de 100.

A 10 le lancer, ecrivez en combien de coups M.x est ruiné.

Et voici ce que j'ai programmé :
#include<stdio.h>
#include<stdlib.h>

int main (void) {
int x;
int MPauvre=100;
int MRiche=1000;
srand(x);
int a=0;

while (MRiche>0 || MPauvre>0) {
x=rand()%2;

if (MRiche==1) {
MRiche=MRiche+10;
MPauvre=MPauvre-10;
a=a+1;
}
if (MPauvre==1) {
MRiche=MRiche-10;
MPauvre=MPauvre+10;
a=a+1;
}
}
if(MPauvre==0) {
printf("MPauvre est ruiné en %d coups\n", a);
}
if (MRiche==0) {
printf("MRiche est ruiné en %d coups\n", a);
}
return 0;
}

Hum ca compile mais ca n 'affiche rien. Je pense que le probleme vient du srand() mais bon je n y connais rien...

HELP !!!!!

merci
A voir également:

5 réponses

Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125
19 févr. 2008 à 20:16
Bonjour,

Le srand, pourquoi pas, mais il se peut que tu es exactement le même hasard à chaque lancement du programme. En général on l'initialise avec la fonction time() qui récupère l'heure en millisecondes. (inclure time.h)

Le vrai problème vient du fait que tu récupères le résultat d'un lancer dans x, mais tu ne t'en sers jamais.

Voilou,

M.

EDIT.:
Si a est incrémenté dans les deux cas, a++; il n'est finalement pas soumis à une condition et peut être augmenté à chaque tour.

Petite question, M Riche et M Pauvre ne changent jamais de choix ?
0
oui en effet, on me demande le mm hasard a chaque lancement.

quant a x dont je ne me sers pas, il faut bien que ce sot qq chose qui prenne la valeur 0 ou 1, non ???
0
Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125
19 févr. 2008 à 21:17
Non, en fait quand je parlais du même hasard ce n'est pas une chance sur deux.
Il est possible en choisissant ce paramètre pour srand que tu ais toujours la même séquence quand tu lances ton programme.

Si sur une partie tu obtiens les lancers Pile, Pile, Face, Pile, Face. Tu as de grandes chances de retomber exactement sur les mêmes à la partie suivante.

Pour ce qui est du x, oui tu récupères la valeur du lancer, mais tu ne va jamais voir le résultat par la suite. Cela peut être génant pour savoir qui a gagné.

M.
0
si je remplace Mpauvre et Mriche par x dans les if du while, ca ne fonctionne pas non plus.
0
Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125
19 févr. 2008 à 21:12
Ce que je ferais, mais peut-être que ce n'est pas dans l'énoncé du problème c'est que M Riche et M Pauvre choisissent à chaque tour leur pari.

Ainsi, pour garder un peu ton programme:
tant que M Riche ET M Pauvre   (Attention tu as mis un OU, ce qui fait aussi que cela ne sera jamais faux)
M Riche choisi une face
M Pauvre choisi une face

On lance la pièce

Si la face de la pièce est celle choisie par M Riche
M Riche prends 10 sous à M Pauvre

Si la face de la pièce est celle choisie par M Pauvre
M Pauvre prends 10 sous à M Riche

On comptabilise le lancer.

On recommence la boucle.


De cette manière on compte aussi les tours où ils font une égalité. Je ne comprends pas trop les tests effectués dans ta boucle. Si 1000 = 1 alors qu'on décrémente 1000 par 10 à la fois, la variable ne vaudra jamais 1. Idem pour l'autre.

Une autre approche du programme : (Je ne sais pas la quelle tu préfères)

D'un point de vu moins joueur et plus statistique...
Ils peuvent choisir :
Pile et Pile
Pile et Face
Face et Pile
Face et Face

Ce qui fait 2 chances sur 4 d'être à égalité, 1 chance sur 4 chacun de gagner.
Je ferais pour cette version statistique un tirage avec 4 possibilités et non 2. C'est à toi de voir si tu préfères simuler une partie ou tirer parmi les résultats possibles d'une partie.

M.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
19 févr. 2008 à 21:17
Salut,

Pour commencer, tu effectues int x, et tu l'utilises dans srand(). Ok mais faut initialiser x à une certaine valeur avant de l'utiliser. Ensuite, l'utilisation de valeurs aléatoires entre deux nombres n'est pas conseillée avec du modulo. La répartition ne sera pas équiprobable. Vaut mieux diviser par RAND_MAX et multiplié par 2.
Enfin, si c'est pile, alors l'un gagne, si c'est face alors c'est l'autre. Faudrait que tu traduises cette condition ( if(x==0) ...)

En espérant t'avoir aidé.
Cordialement
0
Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125
19 févr. 2008 à 21:25
Rebonjour monsieur Fiddy,

En fait je pense que l'idée initiale est justement d'obtenir une valeur non initialisée afin de l'utiliser comme une valeur pseudo aléatoire pour le srand. Je pense que c'est risqué car dépendant de l'OS. Je préfère time() ou sinon le pid.

Quel est le problème du modulo exactement ?

M.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844 > Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010
19 févr. 2008 à 21:35
Non, je pense pas que tu as compris ce qu'il voulait dire. Il veut que ça soit toujours la même suite aléatoire. D'où srand(int), donc tu peux faire srand(x), mais faut que x soit définie. Sinon en effet, si on veut vraiment faire de l'aléatoire srand(time(NULL)) est à utiliser. Mais tout dépend de ce que l'on veut : même suite aléatoire, ou suite vraiment aléatoire.

Pour le problème du modulo : rand() génère un nombre aléatoire entre 0 et RAND_MAX, si on effectue un modulo dessus, les probabilités de chaque nombre ne seront pas les même. Grosso modo, tu n'effectues par une translation pour ramener un domaine à un autre plus petit, tu effectues une homothétie.

Cordialement
0
Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
19 févr. 2008 à 22:41
Doublement d'accord.

Merci,

M.
0