Programmation et dés

Voir le sujet précédent Voir le sujet suivant Aller en bas

Programmation et dés

Message par Gildor le Sam 11 Nov 2017 - 22:51

Comme je vous en ai parlé durant l'AG, voici des petits programmes à faire tourner avec un compilateur de langage C. Ils sont disponibles gratuitement sur le net. Pour ceux qui n'y arrivent pas, je ferai une petite vidéo.

Il s'agit de calculer, grâce à un grand nombre de tirages effectués par la machine, les probabilités de succès de votre jet.

Notez que les programmes ne sont pas conçus pour accepter les erreurs d'utilisateurs : si on vous demande un nombre et que vous tapez des lettres, ça ne va pas fonctionner.


Dernière édition par Gildor le Sam 11 Nov 2017 - 23:02, édité 4 fois

_________________
« Notre race a cessé de se poser des questions. Et ce fut sa perte »
(Un exarque eldar)
avatar
Gildor

Messages : 49
Date d'inscription : 14/11/2015
Age : 39
Localisation : France

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Programmation et dés : nDp

Message par Gildor le Sam 11 Nov 2017 - 22:57

Il s'agit d'un jet fait en lançant n dés, chacun munis de p faces.


#include
#include
#include

#define TIRAGES 100000

int main()
{
int n;
int p;
int somme[TIRAGES];
int i;
int j;
char s[80];
int tcompteur[80];
float tprob[TIRAGES][2];
float cumul;

for(i=0;i {
tprob[i][0]=i+1;
}

printf("Entrez le nombre de des\n");
gets(s);
n=atoi(s);

printf("Entrez le type de de\n");
gets(s);
p=atoi(s);

printf("Sur %d tirages de %dD%d, on obtient\n\n",TIRAGES,n,p);

srand(time(NULL));

for(i=0; i {
somme[i]=0;
for(j=0; j {
somme[i]=somme[i]+(rand()%p +1);
}
}

for(i=n; i<=n*p; i++)
{
tcompteur[i]=0;
for(j=0; j {
if (somme[j]==i)
{
tcompteur[i]++;
}
}
tprob[i][1]=100*(float)tcompteur[i]/(float)TIRAGES;
}

printf("Nombre Occurence Probabilite (%%)\n");
for(i=n; i<=n*p; i++)
{
printf("%3d %5d %5.2f\n",i,tcompteur[i],tprob[i][1]);
}

printf("\n\n");
printf("Score minimum Probabilite (%%)\n");
cumul=100;
for(i=n; i<=n*p; i++)
{
printf(" %3d %6.2f\n",i,cumul);
cumul=cumul-tprob[i][1];
}


return 0;
}

_________________
« Notre race a cessé de se poser des questions. Et ce fut sa perte »
(Un exarque eldar)
avatar
Gildor

Messages : 49
Date d'inscription : 14/11/2015
Age : 39
Localisation : France

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Programmation et dés : difficulté contre nDp

Message par Gildor le Sam 11 Nov 2017 - 23:03

Il s'agit de compter les succès que l'on obtient avec n dés à p faces contre une difficultés donnée.

#include
#include
#include

#define TIRAGES 100000

int main()
{
int n;
int p;
int d;
int i;
int j;
int resultat[TIRAGES];
char s[80];
int tcompteur[80];
float tprob[TIRAGES][2];
float cumul;

srand(time(NULL));

printf("Entrez le nombre de des\n");
gets(s);
n=atoi(s);

printf("Entrez le type de de\n");
gets(s);
p=atoi(s);

printf("Entrez la difficulte\n");
gets(s);
d=atoi(s);

printf("Sur %d tirages de %d D %d avec une difficulte de %d, on obtient : \n\n",TIRAGES,n,p,d );


for(i=0; i {
resultat[i]=0;

for (j=0;j {
if (rand()%p+1 >=d)
{
resultat[i]++;
}
}
}

for(i=0;i {
tprob[i][0]=i+1;
}

for(i=0; i<=n; i++)
{
tcompteur[i]=0;
for(j=0; j {
if (resultat[j]==i)
{
tcompteur[i]++;
}
}
tprob[i][1]=100*(float)tcompteur[i]/(float)TIRAGES;
}

printf("Succes Occurence Probabilite (%%)\n");
for(i=0; i<=n; i++)
{
printf("%3d %5d %4.1f\n",i,tcompteur[i],tprob[i][1]);
}

printf("\n\n");
printf("Nombre succes Probabilite (%%)\n");
cumul=100;
for(i=0; i<=n; i++)
{
printf(" %3d %5.1f\n",i,cumul);
cumul=cumul-tprob[i][1];
}


return 0;
}

_________________
« Notre race a cessé de se poser des questions. Et ce fut sa perte »
(Un exarque eldar)
avatar
Gildor

Messages : 49
Date d'inscription : 14/11/2015
Age : 39
Localisation : France

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Programmation et dés : sélection dans nDp

Message par Gildor le Sam 11 Nov 2017 - 23:05

Il s'agit de lancer n dés à p faces, d'en retirer un certain nombre et d'additionner ceux qui restent. Ceux retirés peuvent aussi bien être les moins bons (avantage) que les meilleurs (désavantage).
#include
#include
#include

#define TIRAGES 100000

void tri(int*,int);

int main()
{
int n;
int p;
int q;
int avantage;
int* tirageNde;
int resultat[TIRAGES];
int i;
int j;
char s[80];
int tcompteur[80];
float tprob[TIRAGES][2];
float cumul;

srand(time(NULL));

printf("Entrez le nombre de des\n");
gets(s);
n=atoi(s);

printf("Entrez le type de de\n");
gets(s);
p=atoi(s);

printf("Entrez le nombre de des a enlever apres lancer\n");
gets(s);
q=atoi(s);

printf("Est-ce avantage(1) ou desavantage(0) ?\n");
gets(s);
avantage=atoi(s);

printf("Sur %d tirages de %d D %d dont on retire les %d des ",TIRAGES,n,p,q );
if (avantage==1)
{
printf("moins bons\n");
}
else
{
printf("meilleurs\n");
};

for(i=0; i {
tirageNde=calloc(n,sizeof(int));
for (j=0;j {
tirageNde[j]=rand()%p+1;
}

tri(tirageNde,n);

if (avantage==1)
{
resultat[i]=0;
for (j=0+q;j {
resultat[i]+=tirageNde[j];
}
}
else
{
resultat[i]=0;
for (j=0;j {
resultat[i]+=tirageNde[j];
}
};
}

for(i=0;i {
tprob[i][0]=i+1;
}

for(i=n-q; i<=(n-q)*p; i++)
{
tcompteur[i]=0;
for(j=0; j {
if (resultat[j]==i)
{
tcompteur[i]++;
}
}
tprob[i][1]=100*(float)tcompteur[i]/(float)TIRAGES;
}

printf("Nombre Occurence Probabilite (%%)\n");
for(i=n-q; i<=(n-q)*p; i++)
{
printf("%3d %5d %4.1f\n",i,tcompteur[i],tprob[i][1]);
}

printf("\n\n");
printf("Score minimum Probabilite (%%)\n");
cumul=100;
for(i=n-q; i<=(n-q)*p; i++)
{
printf(" %3d %5.1f\n",i,cumul);
cumul=cumul-tprob[i][1];
}


return 0;
}


void tri (int* tab,int n)
{
int i;
int permut;
int inversion=0;

do
{
for(i=0; i {
if (i==0)
{
inversion=0;
};
if (tab[i]>tab[i+1])
{
if (inversion==0)
{
inversion=1;
};
permut=tab[i+1];
tab[i+1]=tab[i];
tab[i]=permut;
};
}
}
while(inversion==1);
}


_________________
« Notre race a cessé de se poser des questions. Et ce fut sa perte »
(Un exarque eldar)
avatar
Gildor

Messages : 49
Date d'inscription : 14/11/2015
Age : 39
Localisation : France

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Programmation et dés

Message par Ghislain le Dim 12 Nov 2017 - 16:24

Tu le fais pour ton plaisir ou pour un besoin précis ?
avatar
Ghislain
Admin

Messages : 1026
Date d'inscription : 12/08/2014
Localisation : Champigny sur Marne

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Pourquoi?

Message par Gildor le Dim 12 Nov 2017 - 20:04

C'est pour mon plaisir et ma curiosité. Les probabilités ont parfois des résultats surprenants car contre intuitifs.

Par exemple:

Prenez un groupe de 50 personnes, évidemment prises totalement au hasard.

Quelle est la probabilité que deux personnes dans ce groupe aient la même date d'anniversaire?

_________________
« Notre race a cessé de se poser des questions. Et ce fut sa perte »
(Un exarque eldar)
avatar
Gildor

Messages : 49
Date d'inscription : 14/11/2015
Age : 39
Localisation : France

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Programmation et dés

Message par Ghislain le Dim 12 Nov 2017 - 23:34

Non, parce que si le but c'est de jouer avec des lancers de dés et les proba, il y a plein de sites et d'outils qui le font déjà, par exemple anydice.com
avatar
Ghislain
Admin

Messages : 1026
Date d'inscription : 12/08/2014
Localisation : Champigny sur Marne

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Programmation et dés

Message par Pip le Lun 13 Nov 2017 - 22:17

Les stats, cela passe par les maths, rien d'autre. Et là, c'est moins funky...

La méthode dite 'Monte Carlo' n'est pas exhaustive.

Révise: dénombrement, probabilité, variance, écart type, régression linéaire, loi des grands nombres, gaussiennes, loi normale....

Smile

Pip

Messages : 11
Date d'inscription : 13/08/2014

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Programmation et dés

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum