/*************************************************************************************************************************************/
/* */
/* T I R A G E A P I L E O U F A C E P A R A D O X A L : */
/* */
/* */
/* Nota : */
/* */
/* Ce programme est destine a resoudre le */
/* probleme 'v $Dcourrier_in/20150428165002 From.jeanpierre.borg@orange.fr..Tue.Apr.28.14:59:10.2015'. */
/* */
/* */
/* Author of '$xtc/pile_ou_face_Paradoxal.02$vv$c' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 20150513085056). */
/* */
/*************************************************************************************************************************************/
#include "INCLUDES.01.I"
int EditerLesTirages=VRAI;
int ColorierLesJeuxGagnants=VRAI;
char SeparateurAvantJeuGagnant[]="<";
char SeparateurApresJeuGagnant[]=">";
/* Indicateur de controle des editions de tous les tirages aleatoires. */
#define P \
0
#define F \
1
/* Definition de 'PILE' et 'FACE'... */
char Jeu1[]={P,P,F};
char Jeu2[]={F,P,P};
/* Definition des "Jeu1" et "Jeu2". On notera qu'ils n'ont pas necessairement la meme */
/* longueur ; il est de plus imperatif que le type soit 'char' afin que 'sizeof(...)' */
/* donne bien le nombre d'elements des vecteurs (qui est egal au nombre d'octets...). */
#define NOMBRE_DE_PARTIES \
500
#define NOMBRE_MAXIMAL_DE_TIRAGES_ALEATOIRES \
(100*NOMBRE_DE_PARTIES)
extern double drand48();
#define SEUIL \
(1.0/2.0)
#define TIRAGE_ALEATOIRE \
((int)COND((drand48() < SEUIL),P,F))
/* Generation aleatoire... */
#define EDITER(impression) \
{ \
if (EditerLesTirages == VRAI) \
{ \
impression; \
} \
else \
{ \
} \
} \
/* Edition conditionelle de quelque chose... */
#define K_ESC \
0x1b \
/* Caractere <ESCAPE> (voir a ce propos 'v $xtc/InvVideo.01$c'...). */
#define CouleurDebut \
"["
#define CouleurFin__ \
"m"
#define CouleurReset \
"0"
#define CouleurLumineux \
"1"
#define CouleurFondNoir \
"40"
#define CouleurJeu1 \
"31"
#define CouleurJeu2 \
"33"
#define BCouleur(jeu,couleur) \
{ \
int IndexJeu; \
\
for (IndexJeu=INDEX0 ; IndexJeu <= NombreVersIndex(sizeof(jeu)) ; IndexJeu++) \
{ \
EDITER(printf("\b")); \
/* Retour en arriere car, en effet, le 'jeu' a deja ete marque en minuscule (Noir et Blanc). */ \
} \
\
EDITER(printf("%s",SeparateurAvantJeuGagnant);); \
\
if (ColorierLesJeuxGagnants == VRAI) \
{ \
EDITER(printf("%c%s%s;%s;%s%s",K_ESC,CouleurDebut,couleur,CouleurFondNoir,CouleurLumineux,CouleurFin__);); \
} \
else \
{ \
} \
/* Afin de marquer 'jeu' en couleurs... */ \
}
#define ECouleur \
{ \
\
if (ColorierLesJeuxGagnants == VRAI) \
{ \
EDITER(printf("%c%s%s%s",K_ESC,CouleurDebut,CouleurReset,CouleurFin__);); \
} \
else \
{ \
} \
\
EDITER(printf("%s",SeparateurApresJeuGagnant);); \
}
/* Procedures de coloriage... */
#define EDITER_JEU(jeu) \
{ \
int IndexJeu; \
\
for (IndexJeu=INDEX0 ; IndexJeu <= NombreVersIndex(sizeof(jeu)) ; IndexJeu++) \
{ \
EDITER(printf("%c",COND((jeu[IndexJeu] == P) \
,'P' \
,COND((jeu[IndexJeu] == F) \
,'F' \
,'?' \
) \
) \
); \
); \
/* Marquage de 'jeu' en couleurs et en majuscules... */ \
} \
} \
/* Edition conditionelle d'un jeu gagnant... */
int JeuGagnant;
#define TESTER_JEU(jeu) \
{ \
int IndexTest; \
\
JeuGagnant=VRAI; \
/* A priori, le 'jeu' est gagnant. */ \
\
for (IndexTest=INDEX0 ; IndexTest <= NombreVersIndex(sizeof(jeu)) ; IndexTest++) \
{ \
if (Tirages[IndexTirages-(NombreVersIndex(sizeof(jeu))-IndexTest)] == jeu[IndexTest]) \
{ \
} \
else \
{ \
JeuGagnant=FAUX; \
/* En fait des la premiere non coincidence, on sait que le 'jeu' n'est pas gagnant... */ \
} \
} \
} \
/* Est-on en presence d'un jeu ('Jeu1' ou 'Jeu2') gagnant ? */
main()
{
int IndexParties;
int IndexTirages=INDEX0;
int Tirages[NOMBRE_MAXIMAL_DE_TIRAGES_ALEATOIRES];
int CompteurPILE=0;
int CompteurFACE=0;
int CompteurJeu1=0;
int CompteurJeu2=0;
for (IndexParties=INDEX0 ; IndexParties <= NombreVersIndex(NOMBRE_DE_PARTIES) ; IndexParties++)
{
int LaPartieCouranteNEstPasFinie=VRAI;
int CompteurPartieCourante=0;
while (LaPartieCouranteNEstPasFinie == VRAI)
{
int TirageAleatoireCourant=TIRAGE_ALEATOIRE;
Tirages[IndexTirages]=TirageAleatoireCourant;
CompteurPartieCourante++;
if (TirageAleatoireCourant == P)
{
CompteurPILE++;
EDITER(printf("p"););
/* Marquage des 'PILE's en minuscules quitte a les ecraser ensuite... */
}
else
{
if (TirageAleatoireCourant == F)
{
CompteurFACE++;
EDITER(printf("f"););
/* Marquage des 'FACE's en minuscules quitte a les ecraser ensuite... */
}
else
{
printf("\nERREUR : un autre etat que 'PILE' ou 'FACE' a ete rencontre.\n");
}
}
if (CompteurPartieCourante >= MAX2(sizeof(Jeu1),sizeof(Jeu2)))
{
TESTER_JEU(Jeu1);
if (JeuGagnant == VRAI)
{
CompteurJeu1++;
BCouleur(Jeu1,CouleurJeu1);
EDITER_JEU(Jeu1);
ECouleur;
/* Marquage des tirages gagnants de "Jeu1"... */
LaPartieCouranteNEstPasFinie=FAUX;
}
else
{
TESTER_JEU(Jeu2);
if (JeuGagnant == VRAI)
{
CompteurJeu2++;
BCouleur(Jeu2,CouleurJeu2);
EDITER_JEU(Jeu2);
ECouleur;
/* Marquage des tirages gagnants de "Jeu2"... */
LaPartieCouranteNEstPasFinie=FAUX;
}
else
{
}
}
}
else
{
}
if (IndexTirages < NombreVersIndex(NOMBRE_MAXIMAL_DE_TIRAGES_ALEATOIRES))
{
IndexTirages++;
}
else
{
printf("\nERREUR : debordement de la liste des tirages.\n");
}
}
}
EditerLesTirages=VRAI;
/* Afin de activer 'EDITER(...)' dans 'EDITER_JEU(...)' ci-apres... */
printf("\n");
printf("nombre de tirages = %d = %d+%d\n",IndexTirages,CompteurPILE,CompteurFACE);
printf("nombre de 'pile's = %d\n",CompteurPILE);
printf("nombre de 'face's = %d\n",CompteurFACE);
printf("\n");
printf("nombre de '");
EDITER_JEU(Jeu1);
printf("'s = %d\n",CompteurJeu1);
printf("nombre de '");
EDITER_JEU(Jeu2);
printf("'s = %d\n",CompteurJeu2);
printf("\n");
EDITER_JEU(Jeu1);
printf("/");
EDITER_JEU(Jeu2);
printf(" = %d/%d = %f\n",CompteurJeu1,CompteurJeu2,((double)CompteurJeu1)/((double)(CompteurJeu2)));
/* Le rapport PPF/FPP semble proche de 1/3, cette propriete etant independante du test */
/* effectue dans 'TIRAGE_ALEATOIRE' pour choisir PILE ou FACE... */
}