Partage
  • Partager sur Facebook
  • Partager sur Twitter

Calcul de probabilités

Sujet résolu
    6 août 2021 à 0:35:24

    Bonjour à toutes et à tous,

    Je me fais actuellement la main en programmation et au détour d'un de mes tests je souhaite effectuer un tirage au sort. 
    Pour l'instant je suis sur quelque chose de très simple car je tire au hasard un nombre dans un intervalle de 0 à 99, ce qui donne si je ne me trompe pas 1% de chance à chaque numéro de sortir.

    Étant une bille dans ce genre de calculs, ma première question est "est-ce bien 1%?".

    Là où ça se complique c'est que je souhaite attribuer des paliers de "rareté" à certains intervalles.
    Je pensais faire un second tirage en fonction de l'intervalle du nombre qui sort au premier tirage.

    Par exemple, si un nombre compris entre 50 et 80 sort, j'effectue un second tirage avec 1/2 de chance de valider le premier tirage.

    J'aimerai effectuer ça avec plusieurs palier du type 1/10, 1/100, 1/1000.

    Pouvez-vous m'aider à déterminer la formule pour calculer le % de chance qu'un nombre sorte après un second tirage en fonction des paliers s'il vous plait?

    Merci d'avance de votre attention :)

    -
    Edité par Getrox 6 août 2021 à 0:44:53

    • Partager sur Facebook
    • Partager sur Twitter
      6 août 2021 à 1:13:38

      Bonjour ! Je n'ai pas compris...

      Getrox a écrit:

      Par exemple, si un nombre compris entre 50 et 80 sort, j'effectue un second tirage avec 1/2 de chance de valider le premier tirage.

      Qu'est-ce que tu entends par valider ? Que le second nombre soit lui aussi compris entre 50 et 80 ?

      Et qu'appelles-tu un palier ? Le 1/2 de chance, c'est ça que tu appelles un palier ?

      Getrox a écrit:

      Pouvez-vous m'aider à déterminer la formule pour calculer le % de chance qu'un nombre sorte après un second tirage en fonction des paliers s'il vous plait?

      Le second tirage est indépendant du premier, donc je ne vois pas trop ce que tu veux calculer.

      -
      Edité par robun 6 août 2021 à 1:14:21

      • Partager sur Facebook
      • Partager sur Twitter
        6 août 2021 à 1:45:31

        Bonjour @robun,

        Je vais essayer d'être plus clair dans mes propos ^^

        J'aimerai effectuer un premier tirage 1 nombre au hasard sur 100 (de 0 à 99).

        Et ensuite, si le nombre tiré est disons supérieur à 50, y appliquer un deuxième tirage pour le rendre plus dur à valider.
        Par valider j'entends lui faire passer une seconde condition. La première étant d'être tiré parmi les 100 nombres.

        En code (Ruby), si ça peut aider à clarifier mes propos, j'imagine un truc comme ça:
        - 1er tirage:
        rand(100)
        - Disons que ça me renvoie 51. J'y applique donc un second tirage de "validation" qui pourrait être un truc du genre:
        if nombre > 50 
         validation = rand(10)
         if validation == 0
          nombre validé
         else 
          boucle a partir du premier tirage
         end
        end
        
        Dans cet exemple j'y applique un 2e tirage avec 1 chance sur 10.

        Si je ne dis pas de bêtises, il me suffit d'augmenter mon rand() pour augmenter la difficulté de "validation" et ainsi créer des paliers (rand(10), rand(100), rand(1000)).
        Par palier j’entends avoir des nombres plus simples à sortir que d'autres. Dans cet exemple il est plus simple de "valider" un nombre de 0 à 50 que de 51 à 99.
        Il y a sûrement plus simple/propre pour augmenter la difficulté de "validation" d'un nombre, mais pour l'instant mon cerveau n'a pondu que cette façon de faire.

        Pour le calcule, sachant qu'il y a tant de chance au premier tirage et tant de chance au second, je présume qu'on peux en déduire un % de chance total de "validation" d'un nombre. Un peu comme calculer le % de chance de faire deux fois face en lançant une pièce deux fois.

        Désolé, je n'ai pas le jargon math, j'espère que j'ai été plus clair.

        Edit: En écrivant le truc sur la pièce j'ai tilter.

        Avec l'exemple du rand(10) est-ce que la réponse ne serait pas:
        - Premier lancé 1/100
        - Deuxième lancé 1/10
        Et donc (1/100)x(1/10) = 1/1000?

        La formule serait simplement 1/100 x 1/rand

        -
        Edité par Getrox 6 août 2021 à 1:54:44

        • Partager sur Facebook
        • Partager sur Twitter
          6 août 2021 à 2:20:54

          Et si on faisait les choses à l'envers ...
          Disons que je veux qu'un nombre entre 0 et 50 ait une probabilité de 75% de sortir contre 25% pour entre 51 et 99
          Je fais un rand(100)
          Si le nombre est dans le premier intervalle (0, 74, je lui associe l'intervalle 0,50 et je fais un trand0,50)
          (je ne sais pas si ça existe en Ruby, je pense au randint() de Python)
          Si le nombre est dans le second intervalle (75, 99), je fais un rand(51, 99)
          Si tu as plusieurs intervalles, le problème sera de parcourir la liste des intervalles avec le nombre obtenu lors du premier tirage.
          À l'issue de ce parcours, on obtient un numéro d'intervalle et on lui associe un autre intervalle.
          On pourrait même associer une liste d'intervalles au second niveau également.
          • Partager sur Facebook
          • Partager sur Twitter

          Le Tout est souvent plus grand que la somme de ses parties.

            6 août 2021 à 8:27:44

            Bonjour,

            juste pour éviter un problème XY, pourrais-tu, @Getrox, nous expliquer pourquoi tu veux faire cela et non comment tu veux le faire ?

            • Partager sur Facebook
            • Partager sur Twitter
              6 août 2021 à 14:48:32

              Je donne suite à ma suggestion.
              C'est mon preemier programme en Ruby, soyez indulgents. :)
              -
              # Probabilités relatives.
              prob = [40, 40, 20]
              puts(prob.to_s())
              # Valeurs associées à chaque intervalle.
              vals = [[0, 9], [19, 36], [53, 113]]
              # Seules les valeurs dans les intervalles seront choisies.
              # Probabilités cumulatives pour l'algorithme.
              for i in 1...prob.length()
                  prob[i] = prob[i-1] + prob[i]
              end
              puts(prob.to_s());puts("")
              r = rand(prob[-1])
              puts(r)
              # Trouver le bon intervalle.
              for i in 0...prob.length()
                  if r < prob[i]
                      p = i
                      break
                  end
              end
              puts(p)
              # Valeur aléatoire correspondante.
              n = rand(vals[p][1] - vals[p][0] + 1) + vals[p][0]
              puts(n)
              -
              [40, 40, 20]                                                                                                           
              [40, 80, 100]                                                                                                          
                                                                                                                                     
              52                                                                                                                     
              1                                                                                                                      
              28
              • Partager sur Facebook
              • Partager sur Twitter

              Le Tout est souvent plus grand que la somme de ses parties.

                7 août 2021 à 11:03:21

                Bonjour,

                @WhiteCrow, je cherche à tirer aléatoirement des nombres dans un tableau en faisant en sorte que certains aient moins de chance de sortir que d'autre. Mais au cours de l’exposé de mon problème j'ai résolu ce premier soucis. Maintenant je cherche à calculer les %. 

                @PierroLeFout, merci pour ta suggestion qui semble fonctionnelle, mais j'avoue que je ne comprend pas trop ce qu'elle renvoi ^^'.

                De toute manière, mon code fonctionne. Je cherche juste à calculer les % pour que je puisse l'ajuster correctement.

                Donc pour simplifier tout ce problème que j'ai exposé de la mauvaise manière depuis le début, on peut voir ma question sous cette angle:

                Imaginons j'ai 1d100 et 1d10
                Comment calculer les probabilités de tirer un 1 sur le d100 suivie d'un second 1 sur le d10.
                Et je crois que la réponse c'est simplement 1/100 x 1/10 = 1/1000

                • Partager sur Facebook
                • Partager sur Twitter
                  7 août 2021 à 11:45:10

                  WhiteCrow a posé la bonne question : que veux-tu faire ?

                  Tu as très partiellement répondu. On sait que tu veux tirer un nombre entre 0 et 99 ... mais tu veux que certains nombres sortent plus souvent que d'autres.

                  Je pense deviner que tu veux que les petits nombres sortent plus souvent que les gros, mais on n'est pas là pour tourner en rond et deviner ce que tu veux :) 

                  Pour ta dernière question (1 d100 et 1 d10 ...), la réponse est oui.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    7 août 2021 à 15:54:59

                    Bonjour,

                    @tbc92 effectivement ne perdons pas de temps à deviner ce que je veux alors que je l'ai énoncé. A savoir "On sait que tu veux tirer un nombre entre 0 et 99 ... mais tu veux que certains nombres sortent plus souvent que d'autres" comme tu l'as dis.
                    Je ne veux pas particulièrement que les plus petits, que les plus grands, que les paires ou impairs sortent plus ou moins.

                    Si ça intéresse quelqu'un voici un code qui fait le taff:

                    validation = false
                    
                    while validation != true
                      # on tire aléatoirement un nombre
                      alea_nb = rand(100) # 0 - 99
                      # on passe au deuxième tirage pour augmenter la difficulté
                      if alea_nb > 50 # condition a modifier (intervalle, <, >, =, etc).
                        validation = true
                      elsif alea_nb < 50 # condition a modifier (intervalle, <, >, =, etc).
                        alea_validation = rand(10) # modifier le rand en fonction du taux de chance que l'on veut obtenir
                        if alea_validation == 0
                          validation = true
                        end
                      end
                    end



                    "Pour ta dernière question (1 d100 et 1 d10 ...), la réponse est oui."

                    Parfait j'ai tout ce qui me fallait :D

                    Merci à tous pour l'aide apportée à la résolution de mon problème.
                    Une agréable journée à vous.




                    -
                    Edité par Getrox 7 août 2021 à 16:03:39

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Calcul de probabilités

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown