Forum Programmation.autre [résolu] Problème de proba

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
2
31
oct.
2022

Salut !

Dans le cadre du développement d'un synthétiseur sonore libre, je suis confronté à un petit problème de proba, que je pensais simple en me le posant (et il l'est sûrement), mais je me rends compte que mes cours de lycée sont bien loin et je n'arrive pas à l'aborder…
Un p'tit coup de pouce serait bienvenu, merci d'avance :)

j'ai deux sources de signal A et B. Je veux en sélectionner une au hasard, avec une pondération par un float p qui peut varier entre 0 et 1 (choisi par l'utilisateur).

si p == 0, alors A est sélectionnée dans 100% des cas,
si p == 1, alors B est sélectionnée dans 100% des cas,
si p == 0.5, alors 50% de chance pour chaque source d'être sélectionnée
etc. vous avez compris le truc.

Si je détermine au hasard un entier h, compris entre 0 et RAND_MAX, quelle relation dois-je créer entre p et h pour obtenir en sortie soit 0 soit 1, pour déterminer ma source ?

  • # C'est bien simple

    Posté par  . Évalué à 7.

    Bonjour,

    Soit j'ai pas compris, soit c'est tout simplement (python) :

    import random
    RAND_MAX = 1000
    
    p = 0.25 # proba de B
    source = int(random.randint(0, RAND_MAX) > (1-p) * RAND_MAX)
    
    print(["A", "B"][source])
    • [^] # Re: C'est bien simple

      Posté par  . Évalué à 3.

      Oui, je cherchais à me compliquer inutilement la vie…
      Merci !

    • [^] # Re: C'est bien simple

      Posté par  . Évalué à 4.

      Attention aux bornes:
      si p = 1 et randint = 0, alors tu obtiens:;
      int(0 > 0) = int(False) = 0 => 'A'

      mais si tu mets un >= alors tu auras le pb dans le cas ou p = 0 et randint = 1:
      int(1 >= 1) = int(True) => 'B'

      Pour éviter ça, je serais plutôt sur une approche d'exclusion des cas p=0 et p=1:

      import random
      RAND_MAX = 1000
      
      p = 0.25 # proba de B
      if p == 0 or p == 1:
         source = p
      else:
          source = int(random.randint(0, RAND_MAX) > (1-p) * RAND_MAX)
      print(["A", "B"][source])

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.