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.
Configuration: Windows XP
Firefox 2.0.0.13

7 réponses

  1. 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
  2. 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
  3. 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
  4. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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
    1. 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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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
    1. toto
       
      Bonjour

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

    MAX = 1, MIN = 6;
    Euhhh..... t'es sûr, là ???
    0
    1. 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
      1. 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
  8. 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