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 :

Nombre aléatoire dans un intervalle (à partir d'un autre compris [0,1) )


Sujet :

Algorithmes et structures de données

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Février 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2005
    Messages : 56
    Points : 219
    Points
    219
    Par défaut Nombre aléatoire dans un intervalle (à partir d'un autre compris [0,1) )
    Bonjour,
    Voila le problème, à partir d'un générateur de nombre aléatoire qui produit un réel compris entre 0 et 1 (1 non compris, cad [0,1) ) je voudrais pouvoir générer un nombre compris entre 0 et x (x entier > 1).
    Or en lisant vite fait un article sur wikipédia (http://en.wikipedia.org/wiki/Fisher-Yates_shuffle dans la section modulo bias), je lis que multiplier le nombre compris entre 0 et 1 par x et garder la partie entière provoque un biais. En anglais :
    The problem here is that random floating-point numbers, however carefully generated, always have only finite precision. This means that there are only a finite number of possible floating point values in any given range, and if the range is divided into a number of segments that doesn't divide this number evenly, some segments will end up with more possible values than others. While the resulting bias will not show the same systematic downward trend as in the previous case, it will still be there.
    En gros ca dit que le nombre généré a une précision finie et qu'entre le range [0,1) il n'y a qu'un nombre fini de réel représenté.Et que donc si on divise l' intervalle [0,1) en un nombre fini de segment (soit x ce nombre), alors il y a un probleme si x ne divise pas le nombre de réels effectivement représenté dans [0,1), certains intevalles contiendront en effet plus de nombres que d'autres. Bref si j'ai bien compris certains intervalles seront plus probables que d'autres, et donc au final certaines valeurs seront générées plus que d'autres d'où le biais :/

    J'aimerais donc connaître un moyen afin de générer un nombre entier entre 0 et X sans biais à partir d'un nombre aléatoire compris entre 0 compris et 1 non-compris. Le générateur utilisé est le mersenne twister.
    En fait si y'en a qui connaîssent bien le sujet, toutes les infos sont bienvenues

  2. #2
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Est-il ABSOLUMENT indispensable de générer l'entier aléatoire à partir d'un float ?
    En général on fait le contraire, on génère d'abord une suite d'entiers pseudo-aléatoire (par exemple par les congruences de Lehmer) puis à partir de là, des flottants (pseudo) aléatoires.

  3. #3
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    En utilisant le mersenne twister, j'ai beaucoup de mal a comprendre pourquoi tu passes par l'intermediaire des flottants. En partant d'entiers, pour eliminer tous les biais dont j'ai connaissance, voir la FAQ C ou plus detaille un petit article que j'ai ecrit sur le sujet.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Février 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2005
    Messages : 56
    Points : 219
    Points
    219
    Par défaut
    Merci pour ces réponses

    En fait c'est vrai que passer par l'entier généré est plus simple, comme j'avais dans la tête la multiplication du réel [0,1) par un entier je suis resté bloqué dessus.
    En plus si le site du Mersenne Twister n'avais pas été down y'a qques heures j'aurais eu la solution de suite
    Mostly enough to use [0,1)-version, multiply the output by N, then take floor (round-off).
    (Caution: do not use [0,1]-version. Appearance of 1.0 may cause the output of N. This occurs roughly once in 4.2 billion times).
    In the rare case that the rounding-off error becomes a problem, obtain minimum integer n such that N<=2^n, generate integer random numbers, take the most significant n bits, and discard those more than or equal to N.
    Solution que j'ai vue sur un site pour jouer au poker : http://www.bugsysclub.com/club/about/integrity.htm

  5. #5
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    generer de l'aleatoire:
    tout un roman.

    il faut une racine pour le generateur.
    cette racine sert pour le feedback, elle doit etre la plus grande possible pour avoir la periode la plus grande possible. et selon le type d'algo, elle doit etre un nombre premier.

    ensuite, des instructions purement logiques, telles que la rotation de bits, combinée avec un peu de xor, un echange de contenu, encore un peu de xor et de rotations, et un chouia d'additions donne de bon generateur pseudo_aleatoire, sans utiliser le moindre flottant.

    il faut ensuite le voir, pour constater que c'est visiblement aleatoire.
    un mauvais rnd, ça se voit, ça fait des lignes, des zones jamais ecrites, des zones tout le temps ecrites, et ça reboucle vite.

    en asm, on apprend qu'il faut eviter de couper les etapes, et surtout, la representation de [0 à 1) convient parfaitement aux nombres entiers, car leurs plage peut etre vue comme un nombre a virgule fixe, dont la valeur max correspond justement à 1) et la valeur min est un ZERO pur.

  6. #6
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    En quoi ça répond au PO ? Et qu'est-ce que ça apporte de plus que ce qui a déjà été dit ?

  7. #7
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 951
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 951
    Points : 5 671
    Points
    5 671
    Par défaut
    Fie,

    +1 sur PRomu@ld

    A quoi j'ajoute:
    Citation Envoyé par edfed Voir le message
    ...
    il faut une racine pour le generateur.
    cette racine sert pour le feedback, elle doit etre la plus grande possible pour avoir la periode la plus grande possible. et selon le type d'algo, elle doit etre un nombre premier...
    Je crois que tu confonds les termes.
    La période ne dépend pas de la racine, qui n'est là que pour initialiser le générateur. Cette racine n'a rien à voir non plus avec les nombres premiers.

  8. #8
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    là est une reponce, un terme nouveau dans la discution qui à tout a voir:
    comme un nombre à virgule fixe

    et toi tu joue sur les mots.
    la racine est utilisée comme base à chaque iterations, et si on veu une periode la plus grande possible, il faut que la racine soit la plus grande possible, et parfois, il faut que se soit un nombre premier pour que la periode soit reelement grande.

    voilà...
    si tu preferes, pour faire de l'aleatoire, il existe des milliers de solutions.

  9. #9
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913

  10. #10
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    et...

  11. #11
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par edfed Voir le message
    et...
    On y trouve pas le mot racine par exemple. Le mot graine s'y trouve et si ta racine est leur graine, sa valeur n'a une influence sur la periode d'un generateur pseudo-aleatoire que pour les plus mauvais d'entre eux (ou pour un mauvais choix de parametres pour certains qui sont plus acceptables avec de meilleurs parametres).

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/04/2009, 12h51
  2. Générer un nombre aléatoire dans un intervalle
    Par polodu84 dans le forum MATLAB
    Réponses: 2
    Dernier message: 03/03/2008, 18h32
  3. nombre aléatoire dans un interval
    Par Ontolingua dans le forum Débuter
    Réponses: 12
    Dernier message: 28/02/2008, 09h53
  4. Nombre aléatoire dans une chaine
    Par Premium dans le forum C
    Réponses: 14
    Dernier message: 24/05/2006, 15h02
  5. [FLASH MX] Choisir un nombre aléatoire dans une liste
    Par grenatdu55 dans le forum Flash
    Réponses: 4
    Dernier message: 23/04/2005, 22h09

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