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

Algorithmes et structures de données Discussion :

Générer un nombre aléatoire entre 0 et 1 (INCLUS !!!)


Sujet :

Algorithmes et structures de données

  1. #1
    Membre émérite

    Homme Profil pro
    Urbaniste
    Inscrit en
    Mars 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mars 2002
    Messages : 255
    Points : 2 717
    Points
    2 717
    Par défaut Générer un nombre aléatoire entre 0 et 1 (INCLUS !!!)
    J'ai écris (avec beaucoup de mal), une fonction C qui génère un nombre réel aléatoire (passez si ça ne vous intéresse pas, c'est pas super important) :
    J'ai commencé par écrire une fonction qui me génère un octet aléatoire à partir de la fonction rand(), je sais c'est du pseudo aléatoire. Pas grave. Ensuite j'ai généré un nombre réel de cette manière :
    - Signe = (+)
    - Exposant (puissance de 2) = 0
    - Mantisse (valeur comprise dans [0.5;1[) = <généré au hasard>

    Les nombres réels sont ceux du coprocesseur arithmétique. Voir la doc Intel :
    http://www.intel.com/design/intarch/...entium/fpu.htm
    (standard IEEE 754 et 854, réels sur 32, 64 et 80 bits)

    Un réel est codé de cette manière : signe*mantisse*2^exposant
    signe=1 bit (= +1 ou -1)
    mantisse : appartient à [0.5;1[, codé sur un certain nombre de bits dont dépend la précision
    exposant : appartient à [EXP_MIN;EXP_MAX], EXP_MIN et EXP_MAX dépendent du format choisi
    Le problème est que la mantisse ne peut représenter des valeurs qu'entre 0.5 (inclu) et 1 (exclu). Effectivement, 1.0 = (+1)*0.5*2^1.

    Comment rajouter cette valeur ? Si ma mantisse fait 53 bits, j'en génère 54 et je prend la valeur 1.0 que s'ils sont tous posés (= TRUE) ? (et sinon, je tronque le dernier bit) Est-ce que le nombre 1.0 est bien équiprobable dans ce cas-là ?
    ---
    J'ai failli oublié, à la fin ([0.5;1[ -0.5)*2 donne [0;1[ ;-)
    @+ Haypo

  2. #2
    mio
    mio est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Août 2002
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 65
    Points : 168
    Points
    168
    Par défaut
    J'ai bien quelque chose a te proposer qui est relativement simple qui s'inspire d'un methode triviale pour generer des nombre aleatoire gaussien (c'est a dire avec une repartition gaussienne). Si l'on considere que la repartition des nombres tires pour la mantisse est bien uniforme. (traduire l'espace dans lequel il faut se placer pour que cette repartition apparaisse comme un sous-espace remarquble est suffisamment grand), il suffit de tirer ton nombre et de faire (nombre -0.5)*(2+epsilon) avec epsilon nombre positif strictement mais a priori petit. Tu obtient donc un nombre aleatoire tire de maniere uniforme sur ([0.5;1[ -0.5)*(2+epsilon). Ensuite si le nombre obtenu est strictement superieur a 1 tu rejetes et tu retires un nouveau nombre. Le tirage est alors equiprobable sur [0,1].
    Comme d'hab si je dis une betise corrigez-moi.
    @+

  3. #3
    Membre émérite

    Homme Profil pro
    Urbaniste
    Inscrit en
    Mars 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mars 2002
    Messages : 255
    Points : 2 717
    Points
    2 717
    Par défaut
    Ca me semble tout à fait correct ! Je vais essayer ça rapidement. Pb : y'a bcp de nombres entre 0 et 1, le test va durer longtemps :-)

    En C : epsilon=FLT_EPSILON, DBL_EPSLION ou LDBL_EPSILON selon le format choisit (#include <float.h>).

    @+ Haypo

  4. #4
    mio
    mio est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Août 2002
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 65
    Points : 168
    Points
    168
    Par défaut
    Tu sais moi la prog j'en ai pas fait beaucoup, j'aime bien l'algo alors mais quand tu me parles de C... Je n'ai fait qu'un peu de java javascript et HTML c'est tout. Tu n'es pas oblige de prendre le epsilon du langage...

Discussions similaires

  1. Générer des nombres aléatoires entre 2 bornes
    Par Isabella83 dans le forum C
    Réponses: 6
    Dernier message: 18/04/2015, 11h14
  2. [XL-2010] Générer un nombre aléatoire entre 1 et 9999
    Par GADENSEB dans le forum Macros et VBA Excel
    Réponses: 21
    Dernier message: 31/08/2014, 10h48
  3. Générer un nombre aléatoire comprise entre x et y
    Par KamBMN dans le forum LabVIEW
    Réponses: 1
    Dernier message: 11/01/2013, 08h16
  4. Réponses: 4
    Dernier message: 28/04/2010, 14h13
  5. Réponses: 16
    Dernier message: 08/03/2006, 11h18

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