Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1694 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°456178
psebcopath​e
Posté le 12-07-2003 à 17:16:08  profilanswer
 

: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 ?
 
 
 
 

mood
Publicité
Posté le 12-07-2003 à 17:16:08  profilanswer
 

n°456197
Taz
bisounours-codeur
Posté le 12-07-2003 à 17:31:11  profilanswer
 

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
 
 

n°456220
psebcopath​e
Posté le 12-07-2003 à 18:29:46  profilanswer
 

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

n°456232
theshockwa​ve
I work at a firm named Koslow
Posté le 12-07-2003 à 19:13:03  profilanswer
 

++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
n°456237
Taz
bisounours-codeur
Posté le 12-07-2003 à 19:30:36  profilanswer
 

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

n°456247
theshockwa​ve
I work at a firm named Koslow
Posté le 12-07-2003 à 19:43:57  profilanswer
 

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


---------------
last.fm
n°456252
farib
Posté le 12-07-2003 à 19:48:08  profilanswer
 

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

n°456255
Taz
bisounours-codeur
Posté le 12-07-2003 à 19:55:04  profilanswer
 

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

n°456257
theshockwa​ve
I work at a firm named Koslow
Posté le 12-07-2003 à 20:03:19  profilanswer
 

++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
n°456260
red factio​n
Posté le 12-07-2003 à 20:08:08  profilanswer
 

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
mood
Publicité
Posté le 12-07-2003 à 20:08:08  profilanswer
 

n°456264
theshockwa​ve
I work at a firm named Koslow
Posté le 12-07-2003 à 20:14:04  profilanswer
 

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
n°456301
Taz
bisounours-codeur
Posté le 12-07-2003 à 21:35:47  profilanswer
 

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
n°456310
Taz
bisounours-codeur
Posté le 12-07-2003 à 22:25:34  profilanswer
 

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

n°456328
psebcopath​e
Posté le 12-07-2003 à 22:45:05  profilanswer
 

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

n°456344
psebcopath​e
Posté le 12-07-2003 à 23:15:17  profilanswer
 

: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

n°1255040
Face_Off
Posté le 29-11-2005 à 00:16:36  profilanswer
 

: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
n°1255045
Face_Off
Posté le 29-11-2005 à 00:42:35  profilanswer
 

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

n°1255061
Emmanuel D​elahaye
C is a sharp tool
Posté le 29-11-2005 à 08:06:25  profilanswer
 

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/
n°1255107
Elmoricq
Modérateur
Posté le 29-11-2005 à 10:07:30  profilanswer
 

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.

n°1255526
matafan
Posté le 29-11-2005 à 19:13:24  profilanswer
 

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

n°1255534
Tamahome
⭐⭐⭐⭐⭐
Posté le 29-11-2005 à 19:19:44  profilanswer
 

bah c du shuffle quoi...

n°1255555
Elmoricq
Modérateur
Posté le 29-11-2005 à 20:11:10  profilanswer
 

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]

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
Developpement d'une application Intranet, besoin de conseilDemande conseil: Langage, Imagerie, Clustering
une demande de précision pour prog en .net + winform sous 98[VBA Excel]Suppression de feuille sans demande de confirmation microso
[???]conseil : quel language pour...[demande] prog qui éteind un pc
Besoin d'un conseildemande d'aide pour creer un agenda en php
[Python] SoS j'suis coincé avec instruction "random" 
Plus de sujets relatifs à : [c]demande de conseil sur pogrammation random d'une playlist


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR