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

  FORUM HardWare.fr
  Programmation
  C++

  [C++] random_shuffle ne randomize pas

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] random_shuffle ne randomize pas

n°914564
antsite
Je me souviens
Posté le 04-12-2004 à 12:04:54  profilanswer
 

Salut,
malgré un appel à random_shuffle de la manière suivante :
 

Code :
  1. A::A()
  2. {
  3. v.push_back(B(0));
  4. v.push_back(B(1));
  5. v.push_back(B(2));
  6. v.push_back(B(3));
  7. random_shuffle(v.begin(), v.end());
  8. for(vector<B>::const_iterator it=v.begin(); it!=v.end(); it++)
  9.    cout << static_cast<B>(*it).toString() << endl;
  10. }


 
je vois à l'affichage que les objets ne sont pas mélangés...
dans la classe A, vector<B> v;
je ne comprends pas pourquoi. de plus est-ce que mon itération est faite manière correcte pour l'affichage ?
merci


Message édité par antsite le 04-12-2004 à 13:13:42
mood
Publicité
Posté le 04-12-2004 à 12:04:54  profilanswer
 

n°914602
Taz
bisounours-codeur
Posté le 04-12-2004 à 12:58:10  profilanswer
 

Code :
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <iterator>
  4. template<typename T, size_t N>
  5. inline T* begin(T (&t)[N])
  6. {
  7.   return t;
  8. }
  9. template<typename T, size_t N>
  10. inline T* end(T (&t)[N])
  11. {
  12.   return t + N;
  13. }
  14. int main()
  15. {
  16.   int data[] = {1, 2, 3, 4, 5};
  17.   std::copy(begin(data), end(data), std::ostream_iterator<int>(std::cout, " " ));
  18.   std::cout << std::endl;
  19.   std::random_shuffle(begin(data), end(data));
  20.   std::copy(begin(data), end(data), std::ostream_iterator<int>(std::cout, " " ));
  21.   std::cout << std::endl;
  22. }

n°914628
antsite
Je me souviens
Posté le 04-12-2004 à 13:30:45  profilanswer
 

mais je comprends pas, le code marche pour un tableau d'entier comme data[], mais avec mon vecteur rempli d'objets B. Qu'est-ce qui pourrait bien faire échouer le random_shuffle ? j'ai vérifié que begin() retourne bien le premier élément, à priori c'est bon.

n°914634
Lam's
Profil: bas.
Posté le 04-12-2004 à 13:36:55  profilanswer
 

Allez, t'en crève d'envie, fais péter le code de B. Je suis sûr qu'on va trouver des trucs qui manquent (constructeur de recopie, opérateur d'affectation, etc.).

n°914640
antsite
Je me souviens
Posté le 04-12-2004 à 13:46:07  profilanswer
 

Code :
  1. class B
  2. {
  3. public:
  4.   enum letype {Toto, Titi, Tata};
  5.   B(char _c, letype _t) : c(_c), t(_t) {}
  6.   string toString() const;
  7.   bool operator==(const B& droit) { return (c == droit.c) && (t == droit.t); }
  8. private:
  9.   char c;
  10.   letype t;
  11. };


 
voilou,
sinon j'ai essayé quand j'appelle 2fois de suite le random, le dernier élément de vecteur arrive en premier dans le vecteur...


Message édité par antsite le 04-12-2004 à 14:08:56
n°914643
Lam's
Profil: bas.
Posté le 04-12-2004 à 13:49:07  profilanswer
 

Et si tu lui met un constructeur de copie, ça donne quoi ?

n°914644
antsite
Je me souviens
Posté le 04-12-2004 à 13:51:01  profilanswer
 

ben je comprend pas à quoi il sert, celui par défaut il fait pas l'affaire ? y a pas d'alloc dynamique...

n°914645
Lam's
Profil: bas.
Posté le 04-12-2004 à 13:51:48  profilanswer
 

/me summons Taz.

n°914647
antsite
Je me souviens
Posté le 04-12-2004 à 13:54:42  profilanswer
 

une petite explication quant à la nécessité de ce constructeur serait la bienvenue :)
 
edit:
j'ai rajouté ça sans en être convaincu, ça change rien

Code :
  1. B(const B& b)
  2.     {
  3.       c = b.c;
  4.       t = b.t;
  5.     }



Message édité par antsite le 04-12-2004 à 13:59:42
n°914653
Taz
bisounours-codeur
Posté le 04-12-2004 à 14:01:11  profilanswer
 

pourquoi tu static_cast ?

mood
Publicité
Posté le 04-12-2004 à 14:01:11  profilanswer
 

n°914661
Taz
bisounours-codeur
Posté le 04-12-2004 à 14:05:14  profilanswer
 

bof, je vois pas l'utilité de ça ni comment ça pourrait changer quoi que ce soit. on fait ça dans operator= pour éviter de perdre des données. Dans le constructeur, je vois pas.
 
Si ta classe est de type POD, les constructeurs par recopie, affectation devrait être bon. Mais c'est quoi le code de ta fonction membre tostring ?

n°914663
antsite
Je me souviens
Posté le 04-12-2004 à 14:08:13  profilanswer
 

Taz a écrit :

pourquoi tu static_cast ?


 
tout à fait, je l'ai viré, et ça m'a fait penser à déclarer une méthode const pour que ça marche.
enfin ça randomize toujours pas

n°914665
Taz
bisounours-codeur
Posté le 04-12-2004 à 14:09:07  profilanswer
 

c'est ta classe qui est mitée. File ta classe __COMPLÈTE__

n°914666
antsite
Je me souviens
Posté le 04-12-2004 à 14:09:57  profilanswer
 

Code :
  1. string B::toString() const
  2. {
  3.   string s;
  4.   s.append(1, c);
  5.   switch(t)
  6.   {
  7.   case Toto: s += "a"; break;
  8.   case Titi: s += "b"; break;
  9.   case Tata: s += "c"; break;
  10.   }
  11.   return s;
  12. }

n°914668
Lam's
Profil: bas.
Posté le 04-12-2004 à 14:10:47  profilanswer
 

D'ailleurs, c'est pas louche que le compilo accepte de caster le truc pointé par un const_iterator en B (non const) ?

n°914672
Taz
bisounours-codeur
Posté le 04-12-2004 à 14:17:56  profilanswer
 

Code :
  1. #include <string>
  2. class B
  3. {
  4. public:
  5.   enum letype {Toto, Titi, Tata};
  6.   B(char _c, letype _t) : c(_c), t(_t) {}
  7.   std::string toString() const;
  8. private:
  9.   char c;
  10.   letype t;
  11. };
  12. std::string B::toString() const
  13. {
  14.   // revoit les string, tout ça est pas terrible
  15.   std::string s;
  16.   s.append(1, c);
  17.   switch(t)
  18.     {
  19.     case Toto: s += "a"; break;
  20.     case Titi: s += "b"; break;
  21.     case Tata: s += "c"; break;
  22.     }
  23.   return s;
  24. }
  25. #include <vector>
  26. #include <algorithm>
  27. #include <iostream>
  28. void print(const std::vector<B> &values)
  29. {
  30.   for(size_t i = 0; i < values.size(); ++i)
  31.     std::cout << values[i].toString() << ' ';
  32.   std::cout << std::endl;
  33. }
  34. int main()
  35. {
  36.   std::vector<B> values;
  37.   values.push_back( B('T', B::Toto) );
  38.   values.push_back( B('a', B::Tata) );
  39.   values.push_back( B('z', B::Titi) );
  40.   print(values);
  41.   std::random_shuffle(values.begin(), values.end());
  42.   print(values);
  43. }


 

Citation :

Ta ac zb  
Ta zb ac

n°914678
antsite
Je me souviens
Posté le 04-12-2004 à 14:31:40  profilanswer
 

bordel je comprends pas, y a toujours juste le dernier élément du vecteur qui passe premier et c'est le seul changement...
 
je précise que ce fait taz dans le main, moi je le fais dans le constructeur de la classe contenant le fameux vecteur à shuffler.


Message édité par antsite le 04-12-2004 à 14:32:57
n°914679
Taz
bisounours-codeur
Posté le 04-12-2004 à 14:32:33  profilanswer
 

ah ben si après t'as un problème de combinatoire ... tu crois qu'il y a combien d'arrangement de 3 éléments ?

n°914684
antsite
Je me souviens
Posté le 04-12-2004 à 14:35:08  profilanswer
 

oui mais moi j'en ai mis 5 par exemple

n°914687
Taz
bisounours-codeur
Posté le 04-12-2004 à 14:36:44  profilanswer
 

et ben refais encore un shuffle dessus

n°914690
antsite
Je me souviens
Posté le 04-12-2004 à 14:39:23  profilanswer
 

et bien du coup on décale encore d'un rang :
au début j'avais a b c d e
après 1 shuffle : e a b c d
après 1 shuffle : d e a b c

n°914693
Taz
bisounours-codeur
Posté le 04-12-2004 à 14:41:24  profilanswer
 

et alors ? il est pù le problème ?

n°914694
antsite
Je me souviens
Posté le 04-12-2004 à 14:43:12  profilanswer
 

ben le problème c'est qu'avec 50 éléments c'est pareil, alors à moins que j'ai pas bien compris ce que fait shuffle, ça ne me satisfait pas comme "randomization" du vecteur ?

n°914700
Taz
bisounours-codeur
Posté le 04-12-2004 à 14:48:11  profilanswer
 

ce qui est bizarre, c'est que ton random_shuffle, on dirait next_permutation
 
c'est quoi ta STL ?
 
edit:

Code :
  1. values.push_back( B('T', B::Toto) );
  2.   values.push_back( B('a', B::Tata) );
  3.   values.push_back( B('z', B::Titi) );
  4.   values.push_back( B('F', B::Toto) );
  5.   values.push_back( B('o', B::Tata) );
  6.   values.push_back( B('r', B::Titi) );
  7.   values.push_back( B('E', B::Toto) );
  8.   values.push_back( B('v', B::Tata) );
  9.   values.push_back( B('e', B::Titi) );
  10.   values.push_back( B('r', B::Titi) );

et moi je voudrais que tu testes mon exemple avec tout ça, voir ce que te donne un random_shuffle dessus


Message édité par Taz le 04-12-2004 à 14:50:38
n°914711
antsite
Je me souviens
Posté le 04-12-2004 à 14:55:21  profilanswer
 

oh mais c'est que tu aurais bien raison sur ce doute :
je viens de compiler en ssh à la fac, et ça shuffle bien !
> ma version de STL serait-elle obsolète ?

n°914716
Taz
bisounours-codeur
Posté le 04-12-2004 à 14:57:02  profilanswer
 

t'as quoi ?

n°914720
antsite
Je me souviens
Posté le 04-12-2004 à 15:00:33  profilanswer
 

Ta ac zb Fa oc rb Ea vc eb rb
rb Ta ac zb Fa oc rb Ea vc eb

n°914723
Taz
bisounours-codeur
Posté le 04-12-2004 à 15:06:46  profilanswer
 

comme version :o

n°914726
antsite
Je me souviens
Posté le 04-12-2004 à 15:11:51  profilanswer
 

mais comment je le vois ? le rep qui contient les include c'est 3.3.3 il me semble maintenant la STL je sais comment le savoir...

n°914727
Taz
bisounours-codeur
Posté le 04-12-2004 à 15:14:02  profilanswer
 

mais PUTAIN t'as quoi comme compilateur / libstdc++, packagé par qui etc ? ça fait 2 jours qu'on tourne autour du pot, j'en ai marre. T'as qu'à envoyer un rapport de bug à qui te fournit ton compilateur, moi j'en ai ma claque.

n°914736
antsite
Je me souviens
Posté le 04-12-2004 à 15:22:56  profilanswer
 

tout ce que je peux te dire en regardant les packages installés  de cygwin :
gcc-g++ 3.3.3-3
de plus il me semble que cygwin utilise mingw.
voila maintenant j'en sais pas plus...

mood
Publicité
Posté le   profilanswer
 


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

  [C++] random_shuffle ne randomize pas

 

Sujets relatifs
[java] un random avec une valeur intrandom background picture
random à partir d'un nombrerandom
Pige pas randomize et comportementrandom
fonction Random pas si aleatoire ke sa[HTML] Dossier protégé, les images s'affichent random
[c]demande de conseil sur pogrammation random d'une playlistRandomize et autre ...
Plus de sujets relatifs à : [C++] random_shuffle ne randomize pas


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