Problème programmation C, pari du chevalier

creedy38 Messages postés 3 Statut Membre -  
 toto -
Bonjour, je suis débutant en programmation (C), et j'ai eu un problème lors de la conception un programme qui simule le pari du Chevalier de Méré.

[Pari : Si l’on jette 4 fois un dé à six faces, il y a plus de chances qu’on obtienne un 6 plutôt qu’on n’en obtienne pas.]

Voici mon code:

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

int main(int argc, char *argv[])
{
long compteur;
long nombrE = 0, nombRe = 0, nomBre = 0, noMbre = 0;
const long MAX = 1, MIN = 6;
long a = 0;
long b = 0; //On met en place les variables et les constantes

for (compteur = 1 ; compteur < 100 ; compteur++)
{
srand(time(NULL));
nombrE = (rand() % (MAX - MIN + 1)) + MIN;

srand(time(NULL));
nombRe = (rand() % (MAX - MIN + 1)) + MIN;

srand(time(NULL));
nomBre = (rand() % (MAX - MIN + 1)) + MIN;

srand(time(NULL));
noMbre = (rand() % (MAX - MIN + 1)) + MIN; //On demande 4 nombres aléatoires entre 1 et 6

if (nombrE == 6 || nombRe == 6 || nomBre == 6 || noMbre == 6); //La condition pour gagner
{
a++; //On incrémente la varible qui compte les victoires
}

else //Coups perdus
{
b++; //On incrémente la varible qui compte les défaites
}

printf("Gagne: %ld / Perdu: %ld / Total: %ld",a, b, compteur); //Enfin on affiche le tout

}

system("PAUSE");
return 0;
}

Cependant quand j'essaie de le compiler, Code::blocks m'envoie les messages d'erreurs suivants:
ligne 32"syntax error before "else""
et
ligne 41 "syntax error before string constant"

Quelqu'un peut-il m'aider à résourdre ce problème.
Merci d'avance.

7 réponses

Utilisateur anonyme
 
Pour la première erreur : tu as mis un point virgule après ton if() => que la condition soit vraie ou fausse ça passe dans ton {a++;} et le else ne veut donc rien dire tout seul ^^

Pour la 2ème jsais pas j'ai la flemme de chercher en fait :p
0
asmx86 Messages postés 22 Statut Membre 15
 
Voila le code complet .......>

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

int main(int argc, char *argv[])
{
long compteur;
long nombrE = 0, nombRe = 0, nomBre = 0, noMbre = 0;
const long MAX = 1, MIN = 6;
long a = 0;
long b = 0; //On met en place les variables et les constantes

for (compteur = 1 ; compteur < 100 ; compteur++)
{
srand(time(NULL));
nombrE = (rand() % (MAX - MIN + 1)) + MIN;

srand(time(NULL));
nombRe = (rand() % (MAX - MIN + 1)) + MIN;

srand(time(NULL));
nomBre = (rand() % (MAX - MIN + 1)) + MIN;

srand(time(NULL));
noMbre = (rand() % (MAX - MIN + 1)) + MIN; //On demande 4 nombres aléatoires entre 1 et 6

if (nombrE == 6 || nombRe == 6 || nomBre == 6 || noMbre == 6) //La condition pour gagner
{
a++; //On incrémente la varible qui compte les victoires
}

else //Coups perdus
{
b++; //On incrémente la varible qui compte les défaites
}

printf("Gagne: %ld / Perdu: %ld / Total: %ld \n",a, b, compteur); //Enfin on affiche le tout

}

system("PAUSE");
return 0;
}

une chance sur 1296 ..>.loooooooool
0
creedy38
 
Merci beaucoup pour ce coup de pouce mais il doit encore y avoir un problème dans la création de nombres aléatoires, car normalement par le calcul on trouve que la probabilité de gagner et de 0,517746914, juste au dessus de 1/2, ce qui n'est pas du tout ce que trouve l'ordi.
0
eriiic Messages postés 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
Bonjour,

100 est peut-être un peu juste pour s'approcher suffisamment 0.51
Essaie avec plus de tirage (1000, 5000, 10000,..) pour voir si ça tend vers ta valeur.
eric
0
creedy38
 
Oui j'ai essayé avec des nombre plus grands (100 000 000) mais on est là encore très loin de 0,51
0

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

Posez votre question
eriiic Messages postés 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
de toute façon je dirais que ta probabilité doit être de 0.6666 (4/6) et non 0.51
Si tu t'approches de ça c'est bon
0
toto
 
Bonjour

et avec 6 tirages, tu dirais que la probabilité est de 6/6 ??
0
toto > toto
 
et pendant qu'on y est, la probabilité doit bien être de 7/6 en 7 tirages, non ? :-D
0
toto
 
Bonjour

MAX = 1, MIN = 6;
Euhhh..... t'es sûr, là ???
0
creedy38
 
Normalement la probabilité d'avoir un 6 si tu lance 4 fois les dés est de 0.51:
[(6*6*6*6)-(5*5*5*5)]/(6*6*6*6)=0.517746914

Peut être qu'il faut que je mette MIN=0 et MAX=7
0
toto > creedy38
 
Non, c'est bien 1 et 6

Mais j'aurais dû être plus clair : tu as inversé le max et le min
0
Utilisateur anonyme
 
À propos des nombres aléatoires il faut savoir une chose : ce n'est pas possible d'en avoir avec un pc.
Même les nombres pseudo-aléatoires donnés par le pc ne sont rien d'autre qu'une liste de nombres mélangée.

Le srand(time(NULL)); sert à initialiser l'endroit dans cette liste où on se place. Et je ne crois pas dire de bêtise en disant que le fait de lui passer time(NULL) permet de l'initialiser à un endroit en fonction de la date (précise jusqu'aux secondes mais pas moins).

Donc déjà, le srand(time(NULL)); tu devrais le mettre qu'une seule fois, et au tout début de ton programme. Parce que le faire plein de fois en plein milieu comme tu fais... ton pc il fait les 4 srand en énormément moins d'une seconde, et donc réinitialise au même endroit dans la liste et donc : même nombres "aléatoires" sortis.

Si tu n'es pas persuadé je t'invite à tester ce bout de code :
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char **argv)
{
	int a, b, c, d, i;

	for (i = 0 ; i < 50000 ; i++)
	{
		srand(time(NULL));
		a = rand() % 6 + 1;
		srand(time(NULL));
		b = rand() % 6 + 1;
		srand(time(NULL));
		c = rand() % 6 + 1;
		srand(time(NULL));
		d = rand() % 6 + 1;

		printf("%d %d %d %d\n", a, b, c, d);
	}

	system("PAUSE");
	return 0;
}


Et celui-ci :
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char **argv)
{
	int a, b, c, d, i;

	srand(time(NULL));

	for (i = 0 ; i < 50000 ; i++)
	{
		a = rand() % 6 + 1;
		b = rand() % 6 + 1;
		c = rand() % 6 + 1;
		d = rand() % 6 + 1;

		printf("%d %d %d %d\n", a, b, c, d);
	}

	system("PAUSE");
	return 0;
}


Ce que je fais pour avoir de l'aléatoire encore plus "aléatoire", c'est que je récupère le compteur de temps de mon processeur (RDTSC) ... à 2,2GHz (pour le mien) ça fait qu'il s'incrémente toutes les 0,000 000 45 secondes : c'est absolument improbable (pour ne pas dire impossible) d'avoir plusieurs fois la même valeur en récupérant ça 2 fois (même en le faisant plusieurs fois dans le code).

Si besoin, pour récupérer ce nombre c'est :
unsigned int rdtsc() {
__asm__ __volatile__("rdtsc");
}
0