Problème programmation C, pari du chevalier
creedy38
Messages postés
3
Statut
Membre
-
toto -
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.
[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.
A voir également:
- Problème programmation C, pari du chevalier
- Application de programmation - Guide
- Programmation sms - Guide
- Programmation carte à puce vierge ✓ - Forum Matériel & Système
- Programmation binaire - Guide
- Pari sportif espagne - Forum Algorithmes / Méthodes
7 réponses
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
Pour la 2ème jsais pas j'ai la flemme de chercher en fait :p
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
#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
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.
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
Si tu t'approches de ça c'est bon
À 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 :
Et celui-ci :
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");
}
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");
}