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

Langage Java Discussion :

Générateur de variable aléatoire


Sujet :

Langage Java

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 9
    Par défaut Générateur de variable aléatoire
    Bonjour,

    Je cherche a créer un generateur de variable aléatoire discrete avec une fonction de répartition personnalisée (peut importe, appelons la "f").

    Pourriez vous m'aider? je suis nouveau en java et je m'y perd un peu. Est il possible d'avoir un code general, connaissant la fonction f?

    Merci
    XFM

  2. #2
    Membre expérimenté Avatar de Sebou77
    Inscrit en
    Mars 2006
    Messages
    212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2006
    Messages : 212
    Par défaut
    J'ai rien compris

    Tu veux juste générer des nombres aléatoirement ?
    Si oui tu as la classe Random qui t'aidera beaucoup

    http://java.developpez.com/faq/java/...GE_MATH_random

  3. #3
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par wapita
    Bonjour,

    Je cherche a créer un generateur de variable aléatoire discrete avec une fonction de répartition personnalisée (peut importe, appelons la "f").

    Pourriez vous m'aider? je suis nouveau en java et je m'y perd un peu. Est il possible d'avoir un code general, connaissant la fonction f?

    Merci
    XFM
    Il faut plutôt connaître une transformation de la loi uniforme sur [0;1[ (ou de la loi Gaussienne N(0,1)) vers f.

    Pour générer des tirages suivant la loi uniforme ou la loi gaussienne, utilise la classe Random.

  4. #4
    Membre émérite
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Par défaut
    ton probleme est plus mathematique/algorithmique. je pense que tu aurais plus de reponses dans le forum approprié !

  5. #5
    Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 9
    Par défaut précision
    merci de vos réponses rapides! Je connais en effet la fonction random, mais je voudrais generer des nombre aléatoire avec une repartition non uniforme.

    Bref, cela est peu important. J'ai essayé de simplifier mon probleme:

    en fait j'ai une fonction f:[a,b]->[0,1] strictement croissante, dite "de répartition". mais peu importe son nom.
    Je voudrais une procédure qui étant donné un nombre de [0,1], me retourne son antécédent.

    Est ce plus claire?

    Merci beaucoup

    Xavier

  6. #6
    Membre émérite
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Par défaut
    je crois que j'avais comprs ton premier probleme, et je ne suis pas sur que le deuxieme lui soit equivalent.... pour ce dernier je te fait une reponse de normand : si tu sais calculer explicitement l'inverse de ta fonction, alors c'est facile, sinon, et ben c'est pas evident, peut etre peux tu en obtenir une estimation avec une methode du point fixe.

    mais pour le probleme initial je maintiens que tu devrais poster ca sur la partie algo du forum, voire sur un forum de math : ce que tu cherche n'est pas un code java mais un moyen de "desuniformiser" un generateur aleatoire pour lui faire suivre une fonction de repartition donnée.. je sais que ca se fait mais je n'ai pas de detail precis. mais en postant au bon endroit tu auras plus de chances de tomber sur quelqu'un de plus qualifié que moi !

  7. #7
    Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 9
    Par défaut ok
    voila en effet il me faut inverser la fonction, et non je ne sais pas la calculer, donc il me faut (je pense) une methode numérique. (je veux pouvoir le faire de facon générale, quelquesoit f)
    Je suis ton conseil et m'en vais sur un forum plus algorithmique.
    Merci
    Xavier

  8. #8
    Membre émérite
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Par défaut
    s'il sagit simplement d'inverser la fonction, note que tu peux te ramener a une resolution d'equation. en gros, étant donné un certain y dans [0,1], tu cherches x tel que f(x)=y, cad f(x)-y=0. partnant de la, tu peux utiliser toute la vaste panoplie de methode numerique de resolution d'equation, par exemple une methode du point fixe si ta fonction s'y prete.

  9. #9
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Si ta fonction est une fonction de densité, elle n'est pas bijective, donc elle n'a pas d'inverse... Et l'inverse de toute façon ne serait pas intéressante...

    EDIT: Par contre effectivement la fct de répartition est inversible la plupart des cas, mais pas tout le temps, mais ça ne nous avance pas...

  10. #10
    Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 9
    Par défaut c'est bon
    ®om, en effet ma fonction f est bien la fonction de repartition (je la calcule en prenant l'integrale de 0 a x de la fonction de densité, qui dans mon cas est définie par un morceau de droite et un morceau de parabole) Je suppose qu'elle est inversible, ca doit etre quasiement vrai tout le temps, non?



    Si jamais ca interesse qqun , voila comment je me suis dépatouillé pour avoir ma valeur aléatoire discrete (je la voulais meme entiere mais on peut generaliser avec n'importe quel decoupage), etant donnée la fonction de repartition f:



    > je stocke dans un tableau les f(i) avec i parcourant tous les entiers de f(0)=0 jusqu'a f(imax)=1.

    > je crée une valeur aléatoire r uniforme sur [0,1]

    > je cherche entre quelles i consécutifs se situe mon r et j'en déduit ma valeur aléatoire cherchée.


    Ce n'est pas très beau (tableaux interméiaire, parcours de tableaux à gogo..) et il doit exister plus elegant pour un tel probleme qui je pense est assez classique.
    Peut etre avec une résolution numérique d'équation comme jobherzt le proposait. Mais je ne connais pas assez les proc incluses dans le pack math de java pour savoir si ca peut aboutir facilement.

    Si quelqu'un a mieux a me proposer je suis toujours preneur

    Merci encore pour vos idées

  11. #11
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par wapita
    ®om, en effet ma fonction f est bien la fonction de repartition (je la calcule en prenant l'integrale de 0 a x de la fonction de densité, qui dans mon cas est définie par un morceau de droite et un morceau de parabole) Je suppose qu'elle est inversible, ca doit etre quasiement vrai tout le temps, non?
    Intuitivement, elle n'est pas inversible si tu as un morceau horizontal dans la représentation de f, donc si pr tt x dans [a,b[ tq b>a, tu as F(x) = 0 (où F est la fonction de densité).

  12. #12
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Février 2013
    Messages : 124
    Par défaut hello
    Hello,

    Pour générer des nombres aléatoires tu peux utiliser un générateur congruentiel linéaire.

    par exemple en matlab :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
     
    function [U, X]=GCL(a,b,m,x0,n)
     
    X=zeros(n,1);
    U=zeros(n,1);
     
    for i=2:n
        X(i,1) = (a*X(i-1,1) + b) - floor((a*X(i-1,1) + b)/m)*m;
        U(i,1) = X(i,1)/m; 
    end
     
    end
    Dans ton U tu as généré une séquence de nombre aléatoire entre 0 et 1.
    Il faut remarquer que au bout d'un moment les X se répète et donc les U.
    Il faut donc calibrer ou tirer aléatoire certain a, b et m pour avoir suffisamment de nombres aléatoires.

    De plus tes nombres obtiennent de nombreuse propriété mathématiques intéressante comme la non corrélation entre les valeurs générés, elles sont non prévisible. Elles sont identiquement distribuer et indépendantes et donc tu génère une loi uniforme de 0 à 1.

    Si ton générateur produit m-1 valeurs alors on dit qu'il est full période. voila une liste de a et m intéressante :

    Module m Multiplicateur a Référence
    (2^31)-1 16807 Lewis, Goodman et Miller (1969), Park et Miller(1988)
    (2^31)-1 39373 L’Ecuyer (1988)
    (2^31)-1 742938285 Fishmann et Moore (1986)
    (2^31)-1 950706376 Fishmann et Moore (1986)
    (2^31)-1 1226874159 Fishmann et Moore (1986)
    2147483399 40692 L’Ecuyer (1988)
    2147483563 40014 L’Ecuyer (1988)

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

Discussions similaires

  1. générateur des variable aléatoires
    Par farid0031 dans le forum C++Builder
    Réponses: 2
    Dernier message: 05/05/2011, 00h20
  2. Réponses: 4
    Dernier message: 18/01/2007, 13h48
  3. générateur de nombre aléatoire
    Par ndefta love dans le forum C++Builder
    Réponses: 3
    Dernier message: 07/12/2006, 22h21
  4. Générateurs de nombres aléatoires
    Par Cheps dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 12/06/2006, 00h37
  5. Réponses: 2
    Dernier message: 08/06/2006, 00h10

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