Forum Clubic

Probleme Comprehension Algorithme Aleatoire

Bonjour,

Comme dans le montre clairement le titre, g un problème a comprendre un algorithme(langage C) visant a afficher des chiffres aléatoires sans répétitions. Or, g du mal comprendre trois lignes, que voici:
#include “stdafx.h”
#include “stdlib.h”
#include “time.h”

#define DIM 10

int main(int argc, char* argv[])
{
int i,j, t[DIM+1];

t[1] = 1;
srand(unsigned(time(NULL)));

// Tirage
for ( i = 2; i <= DIM; i++ ) {
j = rand()%i+1;
t[i] = t[j];
t[j] = i;
}

// Affichage
for ( i = 1; i <= DIM; i++ )
printf(“t[%d] = %d\n”, i, t[i]);
return 0;
}

les trois lignes sont:
“for ( i = 2; i <= DIM; i++ ) {
j = rand()%i+1;
t[i] = t[j];
t[j] = i;
}”

Merci beaucoup de votre aide

Et tu ne comprend pas quoi?

bonjour,

desole de ne pas lavoir precise, mais je ne comprends pas ces trois lignes:
// Tirage
for ( i = 2; i <= DIM; i++ ) {
j = rand()%i+1;
t[i] = t[j];
t[j] = i;
}

merci bcp pour laide

Désolé d’avoir été imprécis, mais qu’est-ce que tu ne comprend pas dans ces trois lignes?

Salut,

Encore une fois je mexcuse^^, mais je ne comprends pas très bien le procédé, enfin ce que ca apporte ou en quoi ca fait en sorte que ca marche que d’écrire t[i] = t[j];
t[j] = i;

Merci encore

Salut,

Je comprends que ce soit assez difficile à lire. Après tout, si on me parle de variable t, i et j, je ne vais pas aller bien loin.

Si tu as du mal à comprendre, essaie de renommer tes variables en quelque chose de plus clair.

En l’occurence, i et j (qu’on peut renommer en indexQuelquechose) sont des index du tableau t (qu’on peut renommer en tableau) à parcourir.

Alors avant un peu de recherche sur Internet (parce que bon, le C n’est pas ma tasse de thé … aha aha aha !).
J’allais commencer à expliquer le programme, histoire que je comprenne moi meme. Mais jvais plutot le copier coller et le faire tourner en Java.

Re,

Alors comme indiqué dans le commentaire, l’idée est de effectuer un tirage, c’est à dire de mettre des nombres au pif à chaque case de ton tableau.

Au début, ton tableau contient que des 0.
Progressivement, t[j] = i; va insérer des valeurs dans ton tableau
Et la ligne précédente t[i] = t[j]; va déplacer l’endroit ou l’on insére ces valeurs

Prise à l’endroit, l’idée est de déplacer une valeur quelconque, et d’insérer à son origine une autre valeur.
Ci-dessous une exécution de ton programme :

valeur de i :  2 avant t = 0 0 0 0 0 0 0 0 0 0 
 j = rand()%i+1; =  2
valeur de i :  2 après t = 0 2 0 0 0 0 0 0 0 0 

valeur de i :  3 avant t = 0 2 0 0 0 0 0 0 0 0 
 j = rand()%i+1; =  0
valeur de i :  3 après t = 0 2 0 0 0 0 0 0 0 0 

valeur de i :  4 avant t = 0 2 0 0 0 0 0 0 0 0 
 j = rand()%i+1; =  0
valeur de i :  4 après t = 0 2 0 3 0 0 0 0 0 0 

valeur de i :  5 avant t = 0 2 0 3 0 0 0 0 0 0 
 j = rand()%i+1; =  3
valeur de i :  5 après t = 0 2 5 3 0 0 0 0 0 0 

valeur de i :  6 avant t = 0 2 5 3 0 0 0 0 0 0 
 j = rand()%i+1; =  0
valeur de i :  6 après t = 0 2 5 3 0 4 0 0 0 0 

valeur de i :  7 avant t = 0 2 5 3 0 4 0 0 0 0 
 j = rand()%i+1; =  0
valeur de i :  7 après t = 0 2 5 3 0 4 6 0 0 0 

valeur de i :  8 avant t = 0 2 5 3 0 4 6 0 0 0 
 j = rand()%i+1; =  3
valeur de i :  8 après t = 0 2 8 3 0 4 6 5 0 0 

valeur de i :  9 avant t = 0 2 8 3 0 4 6 5 0 0 
 j = rand()%i+1; =  7
valeur de i :  9 après t = 0 2 8 3 0 4 9 5 6 0 

valeur de i :  10 avant t = 0 2 8 3 0 4 9 5 6 0 
 j = rand()%i+1; =  6
valeur de i :  10 après t = 0 2 8 3 0 10 9 5 6 4 

Edité le 24/04/2009 à 11:01

Rebonjour,

Désolé pour le retard de la réponse, mais en tout cas l’explication est nickel 8) , exactement le genre de réponse que j attendais.
La seul question qui me vient a l’esprit, c de savoir comment est-ce que l’on est sur qu’il y aura toujours des nombres distinctes.

Merci encore une fois de ton excellente réponse en te remerciant de la prochaine

Attention, avec cet algo, les nombres strictement positifs sont distincts.

Je te donne quelques billes, histoire que tu te creuses un peu les méninges :
t[i] = t[j];
t[j] = i;

Que fait la première ligne ?
Que fait la seconde ligne ?
Si tu prends un tableau avec que des 0, n’importe quelle valeur de i et j dans ton tableau, que ce passe-t-il ?
Meme question, mais avec le tableau précédent, i = i + 1 et j = n’importe quel rang du tableau. Que se passe-t-il ?