[Paradoxe des anniversaires] Plantage du programme

Résolu/Fermé
fizzpass - 24 oct. 2013 à 17:14
 fizzpass - 24 oct. 2013 à 18:24
Bonjour,
.
Ci-dessous, j'ai essayé de détailler un maximum mon problème.
.
Le paradoxe des anniversaires : quelle est la probabilité P que sur n personnes, au moins 2 aient le même anniversaire (représenté par un nombre entre 1 et 365).
.
Je dois écrire un programme qui simule cette expérience (j'utilise Code Blocks sous Windows).
Je dois faire un tirage aléatoire pour les n anniversaires, je mets ces valeurs dans un tableau et je fais m fois ce tableau (donc une double boucle selon moi).
Ensuite, je regarde combien de tableaux (parmi les m) comportent au moins 2 anniversaires identiques.
.
.
D'abord je vous fais une liste de ce qui se trouve dans mon programme :
- La fonction Random, je l'ai trouvée sur Internet, et cela nécessitait l'emploi de l'instruction srand (time (NULL));
- La fonction verif, est une fonction que j'ai codée pour vérifier si 2 éléments consécutifs du tableau sont identiques ("consécutifs" parce que je l'utilise après quickSort). Elle est censée renvoyer 0 si non et 1 si oui
- echanger est appelée par quickSort, je les ai trouvées sur Internet. quickSort trie le tableau par ordre croissant, j'ai testé plusieurs fois sur un tableau de taille 10 et ça marchait bien donc je ne pense pas que le problème vienne de là
- Et enfin, le main est de moi sauf pour le srand (time (NULL));
Les variables i, j, k sont dédiées aux boucles, et c est le compteur. Il augmente de 1 à chaque fois qu'un tableau contient 2 éléments identiques.
.
.
J'ai plusieurs soucis (testé sur 2 ordinateurs différents) :
.
1) si n>7 le programme plante. Et j'aimerais bien pouvoir aller jusqu'à 25 (classe d'élèves par exemple)
.
2) si n>4 alors il ne fera qu'un tableau. Par exemple n=4 et m=1000 ça marche, il me sort bien 1000 tableaux différents de 4 éléments, mais pour n=5 et m=2, il ne m'en sort qu'un.
.
3) la variable c prend toujours la 4ème valeur du dernier tableau, et ça, ça me laisse vraiment perplexe, et j'ai tendance à penser que ma fonction verif n'est pas top top.
.
.
Merci d'avance pour votre aide !
.
Voici le code :


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

int Random (int _iMin, int _iMax)
{
return (_iMin + (rand () % (_iMax-_iMin+1)));
}

int verif(int n, int t[n])
{
int conforme;
int i;

conforme=0;
i=0;

while (i<n-1)
{
if (t[i]==t[i+1])
{
conforme=1;
}
i++;
}

return (conforme);
}

void echanger(int tableau[], int a, int b)
{
int temp = tableau[a];
tableau[a] = tableau<gras>;
tableau<gras> = temp;
}

void quickSort(int tableau[], int debut, int fin)
{
int gauche = debut-1;
int droite = fin+1;
const int pivot = tableau[debut];

/* Si le tableau est de longueur nulle, il n'y a rien à faire. */
if(debut >= fin)
return;

/* Sinon, on parcourt le tableau, une fois de droite à gauche, et une
autre de gauche à droite, à la recherche d'éléments mal placés,
que l'on permute. Si les deux parcours se croisent, on arrête. */
while(1)
{
do droite--; while(tableau[droite] > pivot);
do gauche++; while(tableau[gauche] < pivot);

if(gauche < droite)
echanger(tableau, gauche, droite);
else break;
}

/* Maintenant, tous les éléments inférieurs au pivot sont avant ceux
supérieurs au pivot. On a donc deux groupes de cases à trier. On utilise
pour cela... la méthode quickSort elle-même ! */
quickSort(tableau, debut, droite);
quickSort(tableau, droite+1, fin);
}
int main (int argc, char *argv[])
{

int i, j, k, c, n, m, tab[n];

c=0;

printf("Entrez n :\n");
scanf("%d",&n);

printf("Entrez m :\n");
scanf("%d",&m);

srand (time (NULL));

i=0;
do
{
for (j = 0 ; j < n ; j++)
{

tab[j] = Random (1,365);
}

quickSort(tab, 0, n-1);
printf("\nLe tab est :\n");

for (k = 0 ; k < n ; k++)
{
printf("%d\n",tab[k]);

}

printf("\n\n\n");

c=c+verif(n, tab);
i=i+1;
} while (i<m);

printf("Compteur :%d",c);

return 0;
}

1 réponse

J'ai eu la réponse sur developpez.net

<QUOTE=Winjerome;7539752>
Bonjour,

Tu as déjà un problème à cette ligne :
int i, j, k, c, n, m, tab[n];
tu n'as pas encore fixé la valeur de n, ton tableau peut donc faire n'importe quelle taille selon la valeur (aléatoire) de n à ce moment là.
</QUOTE>

Merci de mettre ce sujet en Résolu, je ne parviens pas à le faire
0