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 :

Fonction de tirage


Sujet :

C++

  1. #1
    Membre habitué Avatar de adilou1981
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    251
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 251
    Points : 127
    Points
    127
    Par défaut Fonction de tirage
    Bonjour,

    je suis debutant en C++ ,

    j'ai un vecteur de probabilite exemple : [1/3,1/2,1/6] et un vecteur de prix
    [10,20,30] chaque probabilite correspond a un prix , je voudrais ecrire une fonction qui me retourne un prix en tenant en compte les deux vecteurs.

    Merci davance.
    Tout développeur est un bidouilleur expérimenté

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Déjà, transformer le premier tableau pour qu'il contienne des probabilités cumulées :
    [0, 1/3,1/3+1/2,1]

    Ensuite, tirer aléatoirement un nombre entre 0 et 1.

    Si le nombre est entre la première case et la deuxième case du tableau, retourner le premier prix.
    Si le nombre est entre la deuxième case et la troisième case du tableau, retourner le deuxième prix.
    ...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre habitué Avatar de adilou1981
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    251
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 251
    Points : 127
    Points
    127
    Par défaut
    merci pour l idee mais comment tirer aleatoirement un nombre entre 0 et 1
    ca doit etre un decimal , mais rand() retourne un entier ds [0,RAND_MAX]
    Tout développeur est un bidouilleur expérimenté

  4. #4
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Quelque chose comme 1 divisé par RAND_MAX ?
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Soit tu fais ça, soit tu te débrouilles pour que ton tableau initial ne soit pas des flottants entre 0 et 1, mais des entiers entre 0 et RAND_MAX. Comme ça, une fois le tableau initialisé, tu travailles uniquement avec des entiers, ce qui est plus simple.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    salut,
    Citation Envoyé par r0d Voir le message
    Quelque chose comme 1 divisé par RAND_MAX ?
    Tu ne veux pas plutot dire 1/rand()

    Sinon tu auras toujours le même résultat: typiquement 1/255
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Vi effectivement
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  8. #8
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 73
    Points : 68
    Points
    68
    Par défaut
    Plutôt que 1 / rand(), qui peut aboutir à des divisions par zéro, je ferais plutôt rand() / RAND_MAX.
    De plus, je n'arrive pas à mettre le doigt sur une explication, mais j'ai l'intutition que la distribution sera mieux respectée ainsi.

    [edit] J'ai mis le doigt dessus : la probabilité d'avoir un nombre petit sera beaucoup plus importante que celle d'avoir un nombre supérieur à 0.5 par exemple. La distribution sera exponentielle. [edit]

  9. #9
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    Citation Envoyé par stillman Voir le message
    Plutôt que 1 / rand(), qui peut aboutir à des divisions par zéro, je ferais plutôt rand() / RAND_MAX.
    De plus, je n'arrive pas à mettre le doigt sur une explication, mais j'ai l'intutition que la distribution sera mieux respectée ainsi.
    Sauf que RAND_MAX est... une constante (valant "typiquement" 255), et que, dés lors, si tu fait 1/RAND_MAX, tu auras beau le faire jusqu'à la nuit des temps, le résultat sera toujours identique (et tu perd donc tout l'intérêt d'un éventuel appel à une méthode aléatoire)

    Comme, de fait, il reste possible que rand() renvoie 0, il vaut alors mieux utiliser un code du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float /* ou double */ value=(rand()==0 ? 1.0: 1.0/rand());
    voire, car c'est aussi une possibilité (bien que cela implique potentiellement un décalage dans les valeurs)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float/* ou double */ value=1/rand()+1;
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  10. #10
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 943
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 943
    Points : 5 655
    Points
    5 655
    Par défaut
    Fai,
    Citation Envoyé par koala01 Voir le message
    Sauf que RAND_MAX est... une constante (valant "typiquement" 255)
    Je vois quand même beaucoup plus souvent 65535. :

    Citation Envoyé par koala01 Voir le message
    Comme, de fait, il reste possible que rand() renvoie 0, il vaut alors mieux utiliser un code du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float /* ou double */ value=(rand()==0 ? 1.0: 1.0/rand());
    voire, car c'est aussi une possibilité (bien que cela implique potentiellement un décalage dans les valeurs)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float/* ou double */ value=1/rand()+1;
    La méthode habituelle utilise plutôt rand()/RAND_MAX.
    Si les cons volaient, il ferait nuit à midi.

Discussions similaires

  1. [XL-2013] Fonction ALEA pour tirage au sort
    Par lesurfeurdargent dans le forum Excel
    Réponses: 2
    Dernier message: 17/10/2013, 15h34
  2. Fonction de tirage au sort aléatoire.
    Par Luke spywoker dans le forum Débuter
    Réponses: 3
    Dernier message: 31/05/2013, 21h08
  3. Tirage dans une fonction de densité Empirique
    Par Silkus dans le forum SAS STAT
    Réponses: 5
    Dernier message: 21/06/2012, 18h13
  4. Quelle fonction pour faire un tirage au sort de noms
    Par Sofie109 dans le forum VBA Access
    Réponses: 6
    Dernier message: 01/06/2007, 14h52
  5. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

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