Salida verdadera o falsa basada en una probabilidad

2 minutos de lectura

¿Existe una función estándar para Python que genere Verdadero o Falso de manera probabilística en función de la entrada de un número aleatorio de 0 a 1?

ejemplo de lo que quiero decir:

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

el ejemplo anterior si se le da una entrada de, digamos, 0.7 devolverá Verdadero con una probabilidad del 70% y falso con una probabilidad del 30%

import random

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

  • Tenga en cuenta que random.random() genera números uniformemente en [0, 1). 0 inclusive and 1 exclusive

    – one

    Jan 15, 2021 at 8:51

user avatar
Blindy

Given a function rand that returns a number between 0 and 1, you can define decision like this:

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

Assuming that rand() returns a value in the range [0.0, 1.0) (so can output a 0.0, will never output a 1.0).

  • This question is tagged python, so your code sample seems a little out of place.

    – Daenyth

    May 4, 2011 at 17:06

  • @Blindy +1 Thanks for the Pseudo Code 😉 I am from a Java background and quite glad I found your snippet – even if the question is tagged Python.

    – AgentKnopf

    May 1, 2012 at 11:28

  • @Zainodis, heh yea, I find C-like languages to be an almost universal language if used from a really high level!

    – Blindy

    May 1, 2012 at 14:52

Just use PyProbs library. It is very easy to use.

>>> 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]

avatar de usuario
aritra

Uso esto para generar un booleano aleatorio en python con una probabilidad:

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

así que para expandir eso:

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:])

Se me ocurrió esto yo mismo, pero parece funcionar.

avatar de usuario
Pablo

Si desea acumular una gran cantidad de datos, le sugiero que utilice un mapa:

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

  • ¿Qué agrega esto que cualquiera de las respuestas de 8 años no?

    – Pensamientos de dragón

    28 de octubre de 2019 a las 14:07

  • ¿Qué agrega esto que cualquiera de las respuestas de 8 años no?

    – Pensamientos de dragón

    28 de octubre de 2019 a las 14:07

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad