Bonjour,
j’ai essayé de programmer une méthode de mélange, pour cela j’ai créé une fonction int* shuffle(int n), qui à un entier n renvoie une possibilité d’ordre pour les naturels < n. En clair, shuffle(3) devra renvoyer [0, 1, 2] ou [0, 2, 1] ou [2, 1, 0] etc..
Pour cela, j’ai voulu implémenter le Fisher and Yates’_original_method
Voici mon code:
int* shuffle(int len){
int * ret = (int*)malloc(sizeof(int)*len);
char * LL = (char*)malloc(sizeof(char)*len);
memset(LL, 1, len);
int pnt = 0;
int i = len-1;
int delta;
while(i >= 0){
delta = rand_int(0, i);
pnt = 0;
while(delta > 0 || LL[pnt] == 0){
pnt++;
if (LL[pnt]){
delta--;
}
}
ret[len-(i+1)] = pnt;
LL[pnt] = 0;
i--;
}
free(LL);
return ret;
}
rand_int(int a, int b) renvoie un entier de [a, b]; LL[] vaut 0 pour la ième place si i appartient déja à ret, qui est le tableau renvoyé.
Le problème est, quand je test quelque chose du genre :
for (int i = 0; i < 10000; ++i)
{ int* t = shuffle(10);
for(int j=0; j<10; j++){
printf("%i", t[j]);
}
puts("");
}
Et que je test avec:
./a.out | grep 9$ | wc -l
J’obtient à peu près 5000, c’est à dire que la moitié des listes renvoyées finissent par 9, ce qui n’est pas normal…
Voyez vous ou est le problème ? Merci d’avance !
+0
-0