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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 58
    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 : 39
    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
    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.

  3. #3
    Membre actif Avatar de larnicebafteur
    Inscrit en
    Mai 2006
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 133
    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.

  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 : 39
    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
    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

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

    0,123456 = 123/1000 + 456/1000000

  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 : 39
    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
    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.

  7. #7
    Membre actif Avatar de larnicebafteur
    Inscrit en
    Mai 2006
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 133
    Par défaut
    Oui, c'était juste pour expliquer le principe, après, on fait ce qu'on veut.

  8. #8
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 58
    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 actif Avatar de larnicebafteur
    Inscrit en
    Mai 2006
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 133
    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 ...

  10. #10
    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 : 39
    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
    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 "+".

  11. #11
    Membre actif Avatar de larnicebafteur
    Inscrit en
    Mai 2006
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 133
    Par défaut
    Citation Envoyé par koushkov
    Le problème est résolu !
    Alors pense à mettre :

+ 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