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 :

Mersenne Twister : générer des 0 ou 1


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Mersenne Twister : générer des 0 ou 1
    Bonjour à tous,

    Je viens de m'inscrire sur votre forum, même si ça fait plusieurs années que je viens régulièrement y faire un tour

    Je fais appel à vous car je ne vois pas trop comment réaliser un générateur de nombre aléatoire à partir d'une implémentation Mersenne Twister (source ici) afin qu'il ne me génère que des 0 ou des 1 (représente des "bit").

    Concrètement, je dois intégrer MT dans le cadre de calculs scientifiques et mon problème consiste à remplir des tableaux avec des 0 ou des 1 (ordre de taille d'un tableau : [200][10000]). Actuellement, j'utilise un simple rand()%2 mais la période est trop petite pour nos calculs.

    J'ai donc récupérer l'implémentation, mais je n'ai pas trop d'idée sur la manière de générer ces nombres entiers proprements et surtout efficacement...

    Comment feriez-vous ? Merci beaucoup pour votre aide

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 400
    Points : 23 780
    Points
    23 780
    Par défaut
    Bonjour et bienvenue,

    Je n'ai fait que survoler la page derrière ton lien mais il semblerait que le code en question fournisse pas mal de chose intéressantes, comme par exemple :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    /* generates a random number on [0, 2^64-1]-interval */
    unsigned long long genrand64_int64(void)
    {}

    Si c'est bien le cas et que la probabilité est équilibrée et uniformément répartie, donc si chaque bit des 64 du long long a une chance sur deux de tomber sur 0 ou 1, alors il te suffit d'extraire un bit au hasard. En isolant le premier, tu obtiendras directement 0 ou 1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        x = genrand64_int64() & 1;
    Sinon, tu peux utiliser les générateurs de nombres aléatoires de ton système d'exploitation. Par exemple, /dev/random sous Unix et Linux s'appuie sur l'entropie du système pour générer ses nombres, entropie induite par l'activité utilisateur (souris, clavier…), les accès disques, etc.

    L'ennui est que les sources d'activité aléatoires qu'il utilise sont limitées et qu'il s'arrête quand il se tarit, jusqu'à que l'activité reprenne suffisamment pour générer de nouveaux nombres.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Bonjour Obsidian,

    Merci pour ta réponse.

    J'avais pensé à récupérer un seul bit de cette fonction, mais je ne trouvais pas forcément terrible de générer 64 bits pour finalement en récupérer qu'un seul, sachant que j'en ai quelques milliers à générer. Mais je crois bien que je vais finir par faire comme cela, ça me parait être le plus simple.

    Concernant urandom, je n'ai pas choisi cette possibilité car nos serveurs n'ont justement que peu d'activité utilisateur (très très peu d'écriture disque, pas de clavier, pas de souris, simplement une petite connexion ssh de temps en temps,...) et j'ai un peu peur que cette entropie soit faiblarde au vu de la taille des tableaux.

  4. #4
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 594
    Points
    594
    Par défaut
    Sinon tu peux utiliser Park-Miller comme PNRG, il est plus imple et rapide que Mersenne Twister mais a une moins grande periode.

    Ou sinon tu as une autre version de MT : SFMT
    http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/

  5. #5
    Membre éclairé
    Inscrit en
    Juillet 2012
    Messages
    231
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 231
    Points : 870
    Points
    870
    Par défaut
    Salut,

    Citation Envoyé par kbu6789 Voir le message
    je ne trouvais pas forcément terrible de générer 64 bits pour finalement en récupérer qu'un seul
    Et pourquoi ne pas récupérer les 64 bits un à un au lieu de ne récupérer que le premier ?
    Ça te ferait 64 nombres par tirages.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Merci pour vos remarques ! Je n'avais pas vu pour SFMT, je vais m'orienter vers cette solution du coup

    Citation Envoyé par grim7reaper Voir le message
    Et pourquoi ne pas récupérer les 64 bits un à un au lieu de ne récupérer que le premier ?
    Ça te ferait 64 nombres par tirages.
    Euh oui je me suis mal exprimé , je compte bien récupérer chaque bit du lot généré

    Merci à tous

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Bien, j'ai fini d'implémenter SFMT et l'ensemble à l'air de très bien fonctionner.
    Merci encore pour vos suggestions

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/07/2005, 22h19
  2. Comment générer des pages HTML dynamiques ?
    Par Devil666 dans le forum Java EE
    Réponses: 2
    Dernier message: 15/04/2005, 10h56
  3. [CR] Générer des espaces pour une valeur champ
    Par newpress dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 17/02/2005, 17h43
  4. Générer des fichiers PDF
    Par bobbafet dans le forum C++Builder
    Réponses: 5
    Dernier message: 29/11/2004, 23h53
  5. [Java] Générer des rapports à la crystal reports
    Par Vessaz dans le forum Autres outils décisionnels
    Réponses: 4
    Dernier message: 11/10/2004, 19h07

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