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 :

réels aléatoires (double ou long double)


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 58
    Points : 44
    Points
    44
    Par défaut réels aléatoires (double ou long double)
    Bonjour !
    J'ai trouvé beaucoup d'informations sur la répartition aléatoire des entiers mais pas des réels.
    J'ai besoin d'obtenir des réels aléatoirs entre des bornes précises.
    Le problème est que je ne pense pas qu'utiliser la fonction rand() utilisée pour les entiers soit efficace car j'ai besoin d'une très grande précision pour mes réels (je prévoie d'utiliser les double voire long double).
    Me ramener à des réels par des divisions à partir d'entiers fournis par rand() ne donnerait pas une bonne répartition, certains réels ne pouvant jamais être obtenus.

    Je voudrais donc savoir si quelqu'un a la solution à ce problème : algorithme ou bibliothèque à utiliser.

    Une solution pourrait être de construire le réel en donnant une valeur aléatoire à chaque bit mais je ne sais pas comment le faire, et ni ce sera réellement efficace.

    Merci à qui pourra m'aider !

  2. #2
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Une solution pourrait être de construire le réel en donnant une valeur aléatoire à chaque bit mais je ne sais pas comment le faire, et ni ce sera réellement efficace.
    Sans aller jusque là il existe de bonne bibliothèques qui travaillent sur les nombres à longueur et précision arbitraire et fournissent des utilitaires trés puissants.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  3. #3
    Membre habitué Avatar de larnicebafteur
    Inscrit en
    Mai 2006
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 133
    Points : 131
    Points
    131
    Par défaut
    On peut tout à fait concatener des nombres entiers aléatoires afin d'en obtenir un plus grand, ou alors des réels.
    La qualité de répartition des nombres réels obtenus sera identique à celle des nombres entiers.

    Par exemple, si on génére des entiers aléatoires entre 0 et 999 : 367, 903, 007, 812, ...

    Alors, en les concatenant : 0,367903007812...

    (Ensuite, on peut multiplier ce nombre entre 0 et 1 afin d'obtenir un réel enter 2 bornes quelconques a et b).

    On peut tout aussi le faire digit par digit.
    S'il n'y a pas de solution, c'est qu'il n'y a pas de problème

  4. #4
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Oui mais cela risque d'obliger à faire des conversions entre string et nombre en faisant un formatage par flux:
    http://c.developpez.com/faq/cpp/?pag...RINGS_strtonum
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  5. #5
    Membre habitué Avatar de larnicebafteur
    Inscrit en
    Mai 2006
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 133
    Points : 131
    Points
    131
    Par défaut
    Non, pas forcément, car, par exemple :

    0,123456 = 123/1000 + 456/1000000
    S'il n'y a pas de solution, c'est qu'il n'y a pas de problème

  6. #6
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Ou plus précisément:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    0.123456=123.0/1000+456.0/1000000
    car:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     0,123456 = 123/1000 + 456/1000000
    renvoie 0.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  7. #7
    Membre habitué Avatar de larnicebafteur
    Inscrit en
    Mai 2006
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 133
    Points : 131
    Points
    131
    Par défaut
    Oui, c'était juste pour expliquer le principe, après, on fait ce qu'on veut.
    S'il n'y a pas de solution, c'est qu'il n'y a pas de problème

  8. #8
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 58
    Points : 44
    Points
    44
    Par défaut
    Pourrais-tu seriousme me donner le nom de bibliothèques que tu trouves efficaces ou l'endroit où je peux les trouver.

    Sinon pour la concaténation il faudrait alors que je gère par exemple le type string en redéfinissant les opérations, ce qui n'est pas gênant mais je vais devoir appliquer à men réels des fonctions prédéfinies comme les fonctions cosinus et sinus par exemple.
    Alors il faudrait convertir cette chaine de type string en un double qui lui est associé, en lisant la chaîne de caractères. Ton idée me semble pas mal.

    Vous avez raison, on peut directement construire le réel avec les entiers.
    Merci beaucoup, je n'ai donc pas besoin de bibliothèques!

    Le problème est résolu !

  9. #9
    Membre habitué Avatar de larnicebafteur
    Inscrit en
    Mai 2006
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 133
    Points : 131
    Points
    131
    Par défaut
    Non, il n'y a pas besoin de string !!

    On peut tout faire en restant avec des réels.

    Il est vrai qu'on emploie le mot "concatener" pour des chaines de caractère en général, mais ce n'est pas pour cela que je l'ai utilisé ici ...
    S'il n'y a pas de solution, c'est qu'il n'y a pas de problème

  10. #10
    Membre habitué Avatar de larnicebafteur
    Inscrit en
    Mai 2006
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 133
    Points : 131
    Points
    131
    Par défaut
    Citation Envoyé par koushkov
    Le problème est résolu !
    Alors pense à mettre :
    S'il n'y a pas de solution, c'est qu'il n'y a pas de problème

  11. #11
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Sinon pour la concaténation il faudrait alors que je gère par exemple le type string en redéfinissant les opérations
    Non la concaténation est gérée par la classe string avec la redéfinition de l'opérateur "+".
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  12. #12
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 58
    Points : 44
    Points
    44
    Par défaut
    Oui j'avais compris c'est parce que j'avais commencé mon message avant toutes vos réponses.
    Par exemple pour un réel entre 0 et 1, j'initialise mon réel à 0
    puis je le construis en lui additionnant des nombres jusqu'à ce que ma mantisse soit complétée, ce qui va dépendre de la position de mon premier chiffre non nul.

    ex : si mon réel est construit par assemblage de nombres à 3 chiffres
    alors si mon réel commencera par 0.002..., il me faudra deux chiffres de plus que s'il avait commencé par 0.894...

    Merci encore !

  13. #13
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    boost.random propose des outils un peu plus puissants que la fonction rand() de la bibliothèque standard C.
    Boost ftw

  14. #14
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Je plussoie loufoque

  15. #15
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 58
    Points : 44
    Points
    44
    Par défaut
    Ok !
    Je vais essayer d'utiliser boost car j'ai besoin d'un bon générateur (rapide) car j'ai besoin de générer des réels aléatoirs très souvent !
    Faut que j'apprenne à utiliser la fonction uniform_real !
    Rq : La fonction uniform_on_sphere à l'air pas mal pour les problèmes géométriques!

    J'ai trouvé ça à propos de la fonction uniform_real :
    "Note: The current implementation is buggy, because it may not fill all of the mantissa with random bits. "
    Donc tant pis, je vais finalement réutiliser la première idée et donner ma répartition de réels à partir d'entiers même si les performances ne seront peut-être pas au rendez-vous !
    Merci quand même!

  16. #16
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    "Note: The current implementation is buggy, because it may not fill all of the mantissa with random bits. "
    C'est probablement un problème qui n'existe que sur les plateformes non usuelles.
    Le problème doit venir du fait qu'il n'est pas possible de savoir la taille de la mantisse de façon portable.
    Boost ftw

  17. #17
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 58
    Points : 44
    Points
    44
    Par défaut
    Ok merci !
    Finalement, avec quelques difficultés (beaucoup), j'ai réussi à comprendre la bibliothèque random de boost et elle est vraiment bien avec des générateurs intéressants.
    Le seul petit problème qui peut diminuer mes performances, est que, si dans une boucle, j'ai besoin, par exemple, de générer un nombre aléatoire de 0 à n, puis de 0 à n-1, ..., jusqu'à 0 à 1, il faut créer un générateur différent pour chaque étape, mais c'est sans doute un passage obligé (avant je programmais en Caml avec la fonction random__int(n) et je ne me rendais pas compte de ce problème).

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

Discussions similaires

  1. problème de précision : double ou long double?
    Par pimousse3000 dans le forum C++
    Réponses: 3
    Dernier message: 24/04/2007, 19h13
  2. [Conversion]Comment faire pour couper un Double trop long?
    Par dessinateurttuyen dans le forum Général Java
    Réponses: 1
    Dernier message: 13/11/2005, 02h22
  3. Réponses: 4
    Dernier message: 12/09/2003, 11h38
  4. abs pour un long double
    Par barthelv dans le forum C
    Réponses: 2
    Dernier message: 23/07/2003, 16h16
  5. String -> long double (_strlold ?)
    Par haypo dans le forum C
    Réponses: 7
    Dernier message: 25/07/2002, 20h22

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