Rechercher : dans
Par :

[C] probleme permutation indices d'un tableau

Dernière réponse le 21 mar 2008 à 00:19:15 memo67, le 20 mar 2008 à 12:53:58 
 Signaler ce message aux modérateurs

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..

Meilleures réponses pour « [C] probleme permutation indices d'un tableau » dans :
Trier un tableau sans utiliser la fonction sort VoirTrier un tableau sans utiliser la fonction sort D'abord on initialise une variable $max avec la 1ère valeur de tableau. Ensuite on va faire une boucle tant que le tableau contient encore des éléments. C'est avec la fonction splice qui a le rôle...
Décaler les éléments d'un tableau (Rotation) -Récursivité- VoirVoici une procédure récursive qui permet de décaler tous les éléments d’un tableau d’une position à droite à partir de la position p Procedure Decaler (Var t : Tab; p, n : integer); Begin If p
Langage C - Les tableaux VoirType de données complexes Les variables, telles que nous les avons vues, ne permettent de stocker qu'une seule donnée à la fois. Or, pour de nombreuses données, comme cela est souvent le cas, des variables distinctes seraient beaucoup trop lourdes...
Les tableaux en langage C++ VoirType de données complexes Les variables, telles que nous les avons vues, ne permettent de stocker qu'une seule donnée à la fois. Or, pour de nombreuses données, comme cela est souvent le cas, des variables distinctes seraient beaucoup trop lourdes...

1

kilian, le 20 mar 2008 à 13:02:37

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.

Répondre à kilian

2

mype, le 20 mar 2008 à 14:46:36

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]);
} 

Répondre à mype

3

greg, le 20 mar 2008 à 23:55:03

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.

Répondre à greg

4

 Maximvs, le 21 mar 2008 à 00:19:15

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é. Il arrive à Chuck Norris de se prendre pour Dieu, on à tous nos coups de déprime ...

Répondre à Maximvs