[C] probleme permutation indices d'un tableau

Fermé
memo67 Messages postés 5 Date d'inscription mercredi 19 mars 2008 Statut Membre Dernière intervention 22 mars 2008 - 20 mars 2008 à 12:53
Maximvs Messages postés 39 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2010 - 21 mars 2008 à 00:19
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 jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
20 mars 2008 à 14:46
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
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 vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 5 février 2025 1 526
20 mars 2008 à 13:02
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 jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2010 2
21 mars 2008 à 00:19
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

Discussions similaires