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 Expert

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

    Informations professionnelles :
    Activit� : Urbaniste

    Informations forums :
    Inscription : Mars 2002
    Messages : 255
    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 confirm�
    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
    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 Expert

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

    Informations professionnelles :
    Activit� : Urbaniste

    Informations forums :
    Inscription : Mars 2002
    Messages : 255
    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 confirm�
    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
    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. 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. 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