[C] probleme permutation indices d'un tableau

memo67 Messages postés 5 Date d'inscription   Statut Membre Dernière intervention   -  
Maximvs Messages postés 39 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Voila j'suis nouveau et j'ai un petit soucis en C pour mon ter..
J'ai fais mon programme en maple et tout marche:
il y a une fonction qui s'appelle randperm qui fait:
b := randperm(18)
->b := [15, 10, 4, 8, 12, 5, 1, 11, 9, 2, 18, 13, 16, 17, 6, 7, 3, 14]
il affiche aleatoirement une permutation d'un vecteur ligne sans repetition des valeurs..

Mon probleme c'est qu'en C il n'y a pas de fonction similaire..;p

J'ai fais un test qui ressemble à ca:
int main(){

int a,i;
int tab[10];

for(i=0;i<10;i++){
a=rand()%11;
tab[i]=a;
printf("%d\n",tab[i]);
}
return 0;
}
il ma'affiche par exemple->6,10,6,2,1,4,0,6,3,1

Le programme compile pas de probleme mais m'affiche un tableau avec des valeurs qui dans la plupart des cas sont egaux or c'est pas ce que je veux,je veux juste une permutation aleatoire.. :-(
J'ai essayé de faire des boucles while, for,..mais rien a faire..

Si quelqu'un pouvait m'aider, please.. merci d'avance..
A voir également:

4 réponses

mype Messages postés 2435 Date d'inscription   Statut Membre Dernière intervention   437
 
a mon avis il voudrait aussi que les valeur soit differentes pour ça il faut que une fois que tu a tiré le nombre au hasard tu verifie qu'il n'est pas deja dans le tableau
pour ça tu initialise d'abord toutes les cases de ton tableau a 11
for(i=0;i<10;i++)
tab[i]=11;
puis ensuite avant de mettre le nombre tu verifies qu'il n'est pas deja la
for(i=0;i<10;i++){
while(trouve){
trouve=0;
a=rand()%11;
for(j=0;j<10;j++)
if(tab[j]==a)
trouve=1;
}
tab[i]=a;
printf("%d\n",tab[i]);
} 
1
greg
 
Salut memo67,
problème très classique, la solution de mype semble bonne à première vue, mais elle risque pour des tableaux très grand de prendre un temps très très long !
Voici comment il faut procéder.

Première étape : tu génères un tableau de la taille voulu tel que t[i]=i donc 0 1 2 3 4 5 6 etc .....

Deuxième étape : pour i allant de la taille maximale à 2 (boucle décrémentée) fait un rand()%i et inverse les cases t[i] et t[rand()%i]

Ca fera exactement ce que tu souhaite en temps linéaire à la taille du tableau.
Bon courage, Greg.
1
kilian Messages postés 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
Ben oui mais c'est le problème des fonctions comme rand: il faut changer la graine qui génère le calcul du nombre (srand) régulièrement.
Il faudrait que tu cherches une librairie de création de nombres aléatoires plus performante.
0
Maximvs Messages postés 39 Date d'inscription   Statut Membre Dernière intervention   2
 
Essaye d'incorporer cette ligne :

srand( (unsigned)time( NULL ) );

avant la génération du nombre aléatoire.
Normalement ça empêche le programme de retomber sur une valeur déjà généré.
0