69 votes

Sortie vraie ou fausse basée sur une probabilité

Existe-t-il une fonction standard pour Python qui produit une réponse probabiliste de type Vrai ou Faux à partir d'un nombre aléatoire compris entre 0 et 1 ?

exemple de ce que je veux dire :

def decision(probability):
    ...code goes here...
    return ...True or False...

l'exemple ci-dessus, s'il reçoit une entrée de, disons, 0,7, retournera Vrai avec une probabilité de 70% et faux avec une probabilité de 30%.

129voto

NPE Points 169956
import random

def decision(probability):
    return random.random() < probability

4 votes

Notez que random.random() génère des nombres uniformément dans [0, 1]. 0 inclusif et 1 exclusif

3voto

Blindy Points 26706

Étant donné une fonction rand qui renvoie un nombre entre 0 et 1, vous pouvez définir decision comme ça :

bool decision(float probability)
{
   return rand()<probability;
}

En supposant que rand() renvoie une valeur dans l'intervalle [0.0, 1.0) (donc peut sortir un 0.0, ne sortira jamais un 1.0).

16 votes

Cette question est étiquetée python donc votre exemple de code semble un peu déplacé.

1 votes

@Blindy +1 Merci pour le Pseudo Code ;) Je viens d'un milieu Java et je suis très heureux d'avoir trouvé votre extrait - même si la question est étiquetée Python.

0 votes

@Zainodis, heh yea, je trouve que les langages de type C sont un langage presque universel s'ils sont utilisés à un très haut niveau !

1voto

OmerFI Points 68

Il suffit d'utiliser PyProbs bibliothèque. Elle est très facile à utiliser.

>>> from pyprobs import Probability as pr
>>> 
>>> # You can pass float (i.e. 0.5, 0.157), int (i.e. 1, 0) or str (i.e. '50%', '3/11')
>>> pr.prob(50/100)
False
>>> pr.prob(50/100, num=5)
[False, False, False, True, False]

0voto

aritra Points 1

Je l'utilise pour générer un booléen aléatoire en python avec une probabilité :

from random import randint
n=8 # inverse of probability
rand_bool=randint(0,n*n-1)%n==0

donc pour développer cela :

def rand_bool(prob):
    s=str(prob)
    p=s.index('.')
    d=10**(len(s)-p)
    return randint(0,d*d-1)%d<int(s[p+1:])

J'ai trouvé ça tout seul, mais ça semble fonctionner.

-2voto

Paul Points 9

Si vous voulez accumuler beaucoup de données, je vous suggère d'utiliser une carte :

    from numpy import random as rn
    p = 0.15
    data = rn.random(100)
    final_data = list(map(lambda x: x < p, data))

0 votes

Qu'est-ce que cela apporte de plus que toutes les réponses des 8 dernières années ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X