IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

random dynamic bitset


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 4
    Points : 1
    Points
    1
    Par défaut random dynamic bitset
    Bonjour,


    J'ai cherché à initialiser un objet dynamic_bitset (issue de la librairie boost) de façon aléatoire.
    La solution la plus simple qui consiste a appeler le constructeur qui utilise un entier aléatoire :

    boost::dynamic_bitset<> test(Taille, rnd.randInt() );

    n'est pas satisfaisante quand la taille du bitset dépasse la taille de la répresentation binaire de l'entier (dans ce cas, tout les bits "à gauche" sont a zero).
    Evidemment, je ne cherche dans le fond qu'à créer un long tableau de 0 et de 1 aléatoire, ce qui est faisable différemment, mais je compte utiliser ce tableau comme un masque pour faire des opérations bit à bit contre des objets dynamic_bitset. Donc je voudrais le créer directement comme un objet de cette classe.
    Des idées ?
    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut, et bienvenue sur le forum.

    Pourrais tu nous expliquer le but de la manoeuvre, car je dois avouer avoir vraiment du mal à entrevoir la raison pour laquelle tu souhaite disposer d'un bitset de taille aléatoire

    Peut-être essaye tu d'apporter une solution qui n'est pas forcément optimale à un problème se contentant d'une solution bien plus simple
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Puisque tu es avec boost, tu dois pouvoir construire quelque chose avec boost.iterator (boost::transform_iterator + boost::counting_iterator) et boost.random

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Citation Envoyé par koala01 Voir le message
    Salut, et bienvenue sur le forum.

    Pourrais tu nous expliquer le but de la manoeuvre, car je dois avouer avoir vraiment du mal à entrevoir la raison pour laquelle tu souhaite disposer d'un bitset de taille aléatoire

    Peut-être essaye tu d'apporter une solution qui n'est pas forcément optimale à un problème se contentant d'une solution bien plus simple
    Merci pour la réponse. J'ai probablement manqué de précision.
    La taille du bitset n'est pas aléatoire, c'est la valeur des bits qui doit l'être.

    Ma contrainte est que mes bitset ont une taille qui est définie lors de l'execution, pas durant la compilation. Du coup je suis avec la classe dynamic bitset, qui dispose d'un constructeur qui initialise les valeurs du bitset à partir d'un entier, qui peut-être aléatoire. (la méthode prend en argument un entier qui représente la taille du bitset, et un entier (ici aléatoire) à convertir en binaire.
    Mon problème est donc que je ne peux pas generer un "long" bitset aléatoire à partir d'un entier.
    Par exemple si je tire au hasard l'entier :
    5133
    j'obtient comme bitset :

    1010000001101

    Mais si la longueur de mon bitset de - disons - 20, j'ai alors :

    00000001010000001101

    et tout les bits à gauche sont à 0 (et donc pas aléatoire)

    Pour mémoire, mon bitset doit représenter un masque qui contient à chaque position, de facon aléatoire, un 1 ou un 0. J'ai besoin de ce masque pour simuler une recombinaison aléatoire entre deux "chromosomes" représentés sous la forme de dynamic bitset. Et j'ai besoin de generer beaucoup de ces masques dans mon programme, donc je cherche une procédure moins longue que de faire un tirage aléatoire pour chaque bit.

    J'espère que c'est plus clair.
    C'est justement pour éviter de ré-inventer la roue que je poste sur ce forum ; )
    Merci

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Salut,
    Puisque tu es avec boost, tu dois pouvoir construire quelque chose avec boost.iterator (boost::transform_iterator + boost::counting_iterator) et boost.random
    Bonjour et merci

    Est-ce que tu suggères d'iterer sur le bitset et de donner une valeur aléatoire à chaque bit (avec la fonction random ?).
    C'est effectivement la solution vers laquelle je m'apprête à me tourner, mais je regrette de ne pas pouvoir instancier mon bitset à partir d'un (ou de plusieurs entier aléatoire), puis qu'a priori c'est la méthode la plus "économique" pour générer une suite de bit aléatoire.
    Etienne

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par eriolflynn Voir le message
    Bonjour et merci

    Est-ce que tu suggères d'iterer sur le bitset et de donner une valeur aléatoire à chaque bit (avec la fonction random ?).
    C'est effectivement la solution vers laquelle je m'apprête à me tourner, mais je regrette de ne pas pouvoir instancier mon bitset à partir d'un (ou de plusieurs entier aléatoire), puis qu'a priori c'est la méthode la plus "économique" pour générer une suite de bit aléatoire.
    Etienne
    Non, je pensais à utiliser le constructeur qui prend un itérateur de début et un itérateur de fin (itérateur sur un block). Boost.CountingIterator pour faire de 0 à N, et Boost.TransformIterator dessus pour ne pas retourner i mais un random.

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Non, je pensais à utiliser le constructeur qui prend un itérateur de début et un itérateur de fin (itérateur sur un block). Boost.CountingIterator pour faire de 0 à N, et Boost.TransformIterator dessus pour ne pas retourner i mais un random.
    OK, je n'ai pas été étudier les blocks dans boost, mais effectivement il y a un constructeur de dynamic_bitset qui les utilise.
    Donc je pourrai me lancer sur cette piste mais en attendant j'ai trouvé une "solution" qui utilise une chaine de caractères.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    #include "MersenneTwister.h"
    #include <iostream>
    #include <string>
    #include <boost/dynamic_bitset.hpp>
    #include <bitset>
    #include <vector>
    #include <string>
    #include <boost/random.hpp>
    MTRand rnd;
    using namespace std;
     
    int main()
    {
     
    int taille_masque = 150; // La taille désirée pour mon masque
     
    int num=floor(taille_masque/32)+1; // Le nombre d'entier aleatoire necessaire pour le remplir
     
    string s_masque = ""; // la chaine de caractères
    bitset<32> tt;   // Un bitset de longueur 32
     
    // the loop
    for (int i =0 ; i< num ; i++)
    {
    	bitset<32> tt((unsigned long int ) rnd.randInt());
    	s_masque+=tt.to_string();
    }
    boost::dynamic_bitset<> maskfromstring(s_masque);  // mon masque, généré a partir de la chaine de caractère.
     
    cout << maskfromstring << "\n";
     
    maskfromstring.resize(taille_masque);
     
    cout << maskfromstring << "\n";
     
    }

    Ce qui m'embête dans cette solution, c'est d'instancier plein de fois le bitset tt. Je ne sais pas à quel point c'est crade ; )

    Merci en tout cas, je n'irai probablement pas plus loin maintenant que j'ai obtenu "une" solution, mais je suis quand même curieux de connaitre des alternatives peut-être plus canoniques.
    Cordialement,
    Etienne

Discussions similaires

  1. [FLASH MX 2004]Dynamic Text Cliquable
    Par danael dans le forum Flash
    Réponses: 7
    Dernier message: 30/04/2004, 19h55
  2. Script assez difficile avec random
    Par LFC dans le forum Requêtes
    Réponses: 6
    Dernier message: 01/08/2003, 18h02
  3. [langage] random sur liste ou tableau
    Par martijan dans le forum Langage
    Réponses: 2
    Dernier message: 15/07/2003, 14h47
  4. [VB6] : pour faire un Randomize sous vb... merci
    Par delnic dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 22/01/2003, 15h49
  5. Random en Assembleur
    Par funx dans le forum Assembleur
    Réponses: 9
    Dernier message: 02/09/2002, 17h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo