TEMPLATE DE VECTEUR AVEC TIRAGE ALEATOIRE (C++)

cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 - 26 févr. 2008 à 20:06
cs_Sunglasses Messages postés 8 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 11 juillet 2008 - 29 févr. 2008 à 09:57
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/45855-template-de-vecteur-avec-tirage-aleatoire-c

cs_Sunglasses Messages postés 8 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 11 juillet 2008
29 févr. 2008 à 09:57
J'utilise déjà ma propre fonction random :-) (voir dans les fichiers rand.cpp et rand.hpp). C'est une petite bibliothèque de fonctions aléatoire qu'on nous avait fait faire en TP mais j'ai juste laissé la fonction dont j'avais besoin dans mon programme.

Merci !
cs_exar Messages postés 286 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 22 avril 2012 1
29 févr. 2008 à 04:42
Oui, c'est sur !
A noter que tu peux également utiliser ta propore fonction random.
Exemple:

#include
#include <functional>
#include <vector>

...

using namespace std;

ptrdiff_t random(prtdiff_t i){
return srand()%i;
}

ptrdiff_t (*prandom)(ptrdiff_t)=random;

int main(){
vector v;
// ici, on remplit le vecteur

// appel de random_shuffle
random_shuffle(v.begin(), v.end(), prandom);

...

}

Vraiment, je te conseille d t'intéresser à la STL, c'est très pratique !
Bonne continuation !
cs_Sunglasses Messages postés 8 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 11 juillet 2008
28 févr. 2008 à 20:08
C'est sûr qu'on peut réutiliser ce qui existe déjà, mais je fais ça pour apprendre et pour m'entrainer (Et puis aussi parce que j'aime bien réinventer la roue, oui, je l'avoue :-) ).

Faudra que je m'intéresse de plus près à la STL.

En tout cas merci du commentaire !
cs_exar Messages postés 286 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 22 avril 2012 1
27 févr. 2008 à 15:00
Au fait, j'ai fait ça en deux minutes, il faut contrôler que le vecteur n'est pas vide avant de tenter de renvoyer une valeur...
Bon courage !

*********
«Asseyez-vous une heure près d'une jolie fille, cela passe comme une minute. Asseyez-vous une minute sur un poêle brûlant, et cela passe comme une heure. C'est cela la relativité.»

Albert Einstein.
cs_exar Messages postés 286 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 22 avril 2012 1
27 févr. 2008 à 14:50
Plus court avedc la STL:

#ifndef __VECTORALEA_H__
#define __VECTORALEA_H__
#include <vector>
#include 
using namespace std;

template<class T>
class VectorAlea: public vector<T>{
public:
   T Alea();
};

template<class T>
T VectorAlea<T>::Alea(){
   VectorAlea<T> tmp=*this;
   random_shuffle(tmp.begin(), tmp.end());
   T ret=tmp.back();
   tmp.pop_back();
   *this=tmp;
   return ret;
}

#endif


Pour tester:
#include <cstdlib>
#include 
#include "vectoralea.h"

using namespace std;

int main(int argc, char *argv[])
{
    VectorAlea tst;
    for(int cnt=1; cnt<=10; cnt++)
      tst.push_back(cnt);
    for(int cnt=0; cnt<10; cnt++)
      cout<<tst.at(cnt)<<endl;
    cout<<"************************"<<endl;
    for(int cnt=0; cnt<10; cnt++)
      cout<<tst.Alea()<<endl;
    return EXIT_SUCCESS;
}


Sinon, code bien propre !
A+!

*********
«Asseyez-vous une heure près d’une jolie fille, cela passe comme une minute. Asseyez-vous une minute sur un poêle brûlant, et cela passe comme une heure. C’est cela la relativité.»

Albert Einstein.
cs_Sunglasses Messages postés 8 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 11 juillet 2008
26 févr. 2008 à 20:49
Merci, voilà qui est corrigé (ainsi - au passage - que la fonction de suppression qui ne vérifiait pas l'état de la classe, car il faut que l'on ne soit pas en cours de tirage pour modifier le vecteur).

Mais le "delete vect1" ne marche-t-il pas quand même ? en tout cas mon compilo l'accepte, et à l'exécution, on dirait que ça ne pose pas de problème. (ou alors une fuite de mémoire peut-être ?)
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
26 févr. 2008 à 20:06
A l'allocation dynamique de tableaux new _vect1[size] correspond l'opérateur libération de tableaux delete[] vect1.
Rejoignez-nous