[c]demande de conseil sur pogrammation random d'une playlist

demande de conseil sur pogrammation random d'une playlist [c] - C - Programmation

Marsh Posté le 12-07-2003 à 17:16:08    

:hello:  
 
C , SOUS LINUX / UNIX  
 
Je voudrais juste queques conseils sur comment on peut randomiser une playlist .
Pour le moment , j'ai:
- une playlist qui est sauvée sous forme de tableau .
- une fonction random qui me sort au hasard un nombre a partir d'un intervalle .
 
ce que je voudrais c'est produire un radom qui mélange la playlist sans redondance de fichier .
Donc ben je voulais savoir si il existe une fonction pour faire ca , car j'ai pas trouvé .
Si ca existe pas comment eviter la redondance d'un nombre ?
 
 
 
 

Reply

Marsh Posté le 12-07-2003 à 17:16:08   

Reply

Marsh Posté le 12-07-2003 à 17:31:11    

moi je conseille de plutot mélanger le tableau plutot qu'autre chose: c'est chiant les playlist qui te repassent 2 fois la meme chanson alors qu'il y en a plein de pas ecoutées.
 
comment avoir un bon nombre aléatoire?
 
 

Code :
  1. // le #include qui va bien pou ça  
  2. #include <stdlib.h> /* pour srand, rand et RAND_MAX */
  3. #include <time.h> /* pour time */
  4. // la fonction qui renvoie un nombre [0;N[ (bien pour un indice de tableau)
  5. unsigned my_better_rand(unsigned N)
  6. {
  7.   /**
  8.    * beaucoup plus aléatoire et renvoie un entier entre 0 et N
  9.    * (la je fais pas l'explication :oD )
  10.    */
  11.   return (unsigned)((double)rand()/((double)RAND_MAX+1)*N);
  12. }
  13. // et dans ton main, n'oublie pas d'initialiser le générateur de nombres pseudo-aléatoires
  14. int main()
  15. {
  16.   /**
  17.    * initialisation du générateur de nombres pseudos-aleatoires
  18.    * on utilise généralement le temps courant (nombre de secondes ecoulees
  19.    * depuis 01/01/1970)
  20.    * srand => Seed == 'graine'
  21.    */
  22.   srand(time(NULL));


 
voilà. pour l'algo pour mélanger un tableau, je sais pas trop par contre, mais si tu fais des permutations au pif, ça doit marcher à peu pres
 
 

Reply

Marsh Posté le 12-07-2003 à 18:29:46    

ok , ben merci bcp , j'en demandais pas autant , tu m'a mâché tout le travail , merci !!!

Reply

Marsh Posté le 12-07-2003 à 19:13:03    

++Taz a écrit :


Code :
  1. // le #include qui va bien pou ça  
  2. #include <stdlib.h> /* pour srand, rand et RAND_MAX */
  3. #include <time.h> /* pour time */
  4. // la fonction qui renvoie un nombre [0;N[ (bien pour un indice de tableau)
  5. unsigned my_better_rand(unsigned N)
  6. {
  7.   /**
  8.    * beaucoup plus aléatoire et renvoie un entier entre 0 et N
  9.    * (la je fais pas l'explication :oD )
  10.    */
  11.   return (unsigned)((double)rand()/((double)RAND_MAX+1)*N);
  12. }
  13. // et dans ton main, n'oublie pas d'initialiser le générateur de nombres pseudo-aléatoires
  14. int main()
  15. {
  16.   /**
  17.    * initialisation du générateur de nombres pseudos-aleatoires
  18.    * on utilise généralement le temps courant (nombre de secondes ecoulees
  19.    * depuis 01/01/1970)
  20.    * srand => Seed == 'graine'
  21.    */
  22.   srand(time(NULL));



 
<Mode méga boulet activé>
Boh je comprends pas, quand je compile ton code, il me sort qu'il trouve pas la fin de fichier ...
<Mode méga boulet désactivé>
 
T'as oublié une accolade dans ton copier coller ! :D
 
 
[:dehors]


---------------
last.fm
Reply

Marsh Posté le 12-07-2003 à 19:30:36    

maxi boulet, j'ai pas donné un programme, j'ai donné tous les éléments qu'il faut pour obtenir des nombre pseudo-aléatoires...

Reply

Marsh Posté le 12-07-2003 à 19:43:57    

Rho ... C'est bon, hein ? :o
 
 
[:ddr555]


---------------
last.fm
Reply

Marsh Posté le 12-07-2003 à 19:48:08    

++Taz a écrit :

maxi boulet, j'ai pas donné un programme, j'ai donné tous les éléments qu'il faut pour obtenir des nombre pseudo-aléatoires...


taz il poste ses progs sur HFR pour qu'on lui trouve les accolades qu'il oublie de fermer :o

Reply

Marsh Posté le 12-07-2003 à 19:55:04    

farib a écrit :


taz il poste ses progs sur HFR pour qu'on lui trouve les accolades qu'il oublie de fermer :o

ouais, ben personne m'a dit qu'il manquait un return 0;, je peux toujours courir...

Reply

Marsh Posté le 12-07-2003 à 20:03:19    

++Taz a écrit :

ouais, ben personne m'a dit qu'il manquait un return 0;, je peux toujours courir...


 
tain ... en plus, t'es vraiment naze : tu te casses en 2 pour faire une fonction my_better_rand que t'utilises même pas ... Pfff ... Tu programmes vraiment n'importe comment ...  :sarcastic:  
 
 
 [:roxelay]


---------------
last.fm
Reply

Marsh Posté le 12-07-2003 à 20:08:08    

voila suffit de changer la position de chaque chanson dans la playlist
 

Code :
  1. #define NBTITRES 50
  2. for(int i=0;i<100;i++){
  3.   i=my_better_rand(NBTITRES);
  4.   j=my_better_rand(NBTITRES);
  5.   temp = tab[i];
  6.   tab[i]=tab[j];
  7.   tab[j]= temp;
  8. }


Message édité par red faction le 12-07-2003 à 20:11:14
Reply

Marsh Posté le 12-07-2003 à 20:08:08   

Reply

Marsh Posté le 12-07-2003 à 20:14:04    

red faction a écrit :

voila suffit de changer la position de chaque chanson dans la playlist
 

Code :
  1. #define NBTITRES 50
  2. for(int i=0;i<100;i++){
  3.   i=my_better_rand(NBTITRES);
  4.   j=my_better_rand(NBTITRES);
  5.   temp = tab[i];
  6.   tab[i]=tab[j];
  7.   tab[j]= temp;
  8. }




 
Pour être un peux sérieux aussi, je dirais que le nombre d'itérations devrait dépendre du nombre d'éléments dans la liste ... sinon, ca ne mélangera sans doute pas suffisamment dans le cas de liste immenses ... (style sur 400 tracks, si tu ne fais 'que' 100 permutations, bcp de tracks vont rester dans le même ordre)
 
Edit : avec un nombre d'itération du niveau de 2x le nb d'éléments (comme dans l'exemple de red faction), ca devrait être largement ok ...


Message édité par theshockwave le 12-07-2003 à 20:15:06

---------------
last.fm
Reply

Marsh Posté le 12-07-2003 à 21:35:47    

STL à la rescousse. si t'arrives pas à traduire en C, je te le ferais
 

Code :
  1. /*  @brief Shuffle the elements of a sequence using a random number
  2.    *         generator.
  3.    *  @param  first   A forward iterator.
  4.    *  @param  last    A forward iterator.
  5.    *  @param  rand    The RNG functor or function.
  6.    *  @return  Nothing.
  7.    *
  8.    *  Reorders the elements in the range @p [first,last) using @p rand to
  9.    *  provide a random distribution. Calling @p rand(N) for a positive
  10.    *  integer @p N should return a randomly chosen integer from the
  11.    *  range [0,N).
  12.   */
  13.   template<typename _RandomAccessIter, typename _RandomNumberGenerator>
  14.     void
  15.     random_shuffle(_RandomAccessIter __first, _RandomAccessIter __last,
  16.     _RandomNumberGenerator& __rand)
  17.     {
  18.       if (__first == __last) return;
  19.       for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
  20. iter_swap(__i, __first + __rand((__i - __first) + 1));
  21.     }


Message édité par Taz le 12-07-2003 à 21:36:19
Reply

Marsh Posté le 12-07-2003 à 22:25:34    

bon je garantie pas sans bugs, mais pendant la pub de smallville, j'ai traduit en C. sur cet exemple avec efence, ça segfault pas, donc ça à l'air de tenir la route. j'ai suivi strictement l'algo de STL
 

Code :
  1. #include <string.h>
  2. #include <stdlib.h>
  3. void random_shuffle(void* data, size_t n, size_t size, unsigned (*rng)(unsigned))
  4. {
  5.   if(n!=0)
  6.     {
  7.       char *i= NULL;
  8.       char *tmp= NULL;
  9.       char * const first= data;
  10.       char * const last= first + n*size;
  11.       tmp=malloc(size);
  12.       for(i= first+size; i!=last; i+=size)
  13. {
  14.   char * const where= first + rng((i-first)/size)*size + size;
  15.  
  16.   if(i!=where)
  17.     {
  18.       memcpy(tmp, i, size);
  19.       memcpy(i, where, size);
  20.       memcpy(where, tmp, size);
  21.     }
  22. }
  23.       free(tmp);
  24.     }
  25. }
  26. #include <stdlib.h>
  27. #include <time.h>
  28.  
  29.  
  30. unsigned my_better_rand(unsigned N)
  31. {
  32.   return (unsigned)((double)rand()/((double)RAND_MAX+1)*N);
  33. }
  34. #include <stdio.h>
  35. void printIntTab(const int *tab, size_t n)
  36. {
  37.   size_t i=0;
  38.  
  39.   for(i=0; i<n; ++i)
  40.     {
  41.       printf("%d, ", tab[i]);
  42.     }
  43.   putchar('\n');
  44. }
  45. int main()
  46. {
  47.   int tab[10]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  48.   srand(time(NULL));
  49.   printIntTab(tab, 10);
  50.   random_shuffle(tab, 10, sizeof(int), my_better_rand);
  51.   printIntTab(tab, 10);
  52.   return 0;
  53. }

Reply

Marsh Posté le 12-07-2003 à 22:45:05    

merci bcp je vais essayer avec cette nouveauté !!
car pour l'exmple précédent  pb avec cette methode , c'est que mon nombre d'element de la playlist varie avec le random.
Au debut j'en ai 288 , un coup de random et hop 312 , parfois 39 , parfois 120 ...je vais essayer avec ca , merci encore

Reply

Marsh Posté le 12-07-2003 à 23:15:17    

:bounce:  :bounce:  :bounce:  :bounce:  :bounce:  :bounce:  
ca y est c implémenté et ca marche parfaitement sans plantag e, rien , c bonheur !!
 :bounce:  :bounce:  :bounce:  :bounce:  
merci

Reply

Marsh Posté le 29-11-2005 à 00:16:36    

:hello:  
 

Code :
  1. unsigned my_random(unsigned N){
  2.   return (unsigned)((double)rand()/((double)RAND_MAX+1)*N);
  3. }
  4. int main(int argc, char **argv){
  5.   int i;
  6.   srand(time(NULL));
  7.   for(i=0; i<20; i++){
  8.     printf("%d, ", my_random(100));
  9.   }
  10.   return 0;
  11. }


 
Quand j'execute ce code 4 fois j'obtiens par exemple :
89, 76, 49, 95, 8, 33, 68, 99, 50, 41, 37, 96, 85, 53, 86, 94, 43, 55, 63, 82,
89, 9, 3, 69, 39, 45, 77, 90, 1, 22, 36, 96, 52, 4, 54, 47, 25, 12, 68, 53,
89, 32, 39, 64, 37, 72, 58, 21, 58, 66, 28, 99, 36, 63, 41, 52, 80, 80, 75, 18,
89, 24, 57, 66, 9, 52, 0, 87, 14, 84, 21, 1, 50, 21, 57, 46, 7, 23, 58, 94,
 
C'est normal que la première valeure soit toujours la même ?  :??:  
Ca m'oblige à ne pas tenir compte de la première valeure, et de n'utiliser que les valeurs suivantes.
 
Autrement, si j'execute le programme dans la même seconde, j'obtiens la même suite de valeurs. Surement dû au fait que c'est basé sur le nombre de secondes ecoulées depuis le 01/01/1970. Un peu génant, mais ca ira.

Message cité 1 fois
Message édité par Face_Off le 29-11-2005 à 00:16:59
Reply

Marsh Posté le 29-11-2005 à 00:42:35    

Euh ... bon en fait j'ai fait un truc plus simple :
 

Code :
  1. int main(int argc, char **argv){
  2.   int i;   
  3.  
  4.   srand(time(NULL));
  5.   for(i=0; i<20; i++){
  6.     printf("%d, ", rand()%100);
  7.   }
  8.  
  9.   return 0;
  10. }


 
Et ça marche parfaitement pour ce dont j'ai besoin :D

Reply

Marsh Posté le 29-11-2005 à 08:06:25    

Face_Off a écrit :


Code :
  1. unsigned my_random(unsigned N){
  2.   return (unsigned)((double)rand()/((double)RAND_MAX+1)*N);
  3. }
  4. int main(int argc, char **argv){
  5.   int i;
  6.   srand(time(NULL));
  7.   for(i=0; i<20; i++){
  8.     printf("%d, ", my_random(100));
  9.   }
  10.   return 0;
  11. }


C'est normal que la première valeur soit toujours la même ?  :??:  


J'ai remarqué ça avec la bibliothèque de mingw. Il doit y avoir un petit bug dans les fonctions rand() ou srand(). Depuis, j'ignore le premier tirage.
 
Je vais quand même vérifier avec gcc/Linux pour être sûr...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 29-11-2005 à 10:07:30    

Emmanuel Delahaye a écrit :

Je vais quand même vérifier avec gcc/Linux pour être sûr...


 
Sous Solaris/cc (Sun Workshop 6), il n'y a pas ce problème.

Reply

Marsh Posté le 29-11-2005 à 19:13:24    

Dites moi, vous avez quand meme remarque que le topic etait vieux de presque deux ans avant ce magnifique repechage ?

Reply

Marsh Posté le 29-11-2005 à 19:19:44    

bah c du shuffle quoi...

Reply

Marsh Posté le 29-11-2005 à 20:11:10    

matafan a écrit :

Dites moi, vous avez quand meme remarque que le topic etait vieux de presque deux ans avant ce magnifique repechage ?


 
Oui, mais pour une fois je trouve que ce up n'est pas injustifié, la question posée colle pile au sujet.
C'est pas souvent, et je ne connaissais pas le bug (s'il est avéré) de mingW. [:spamafote]

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed