¿Obtener un booleano aleatorio en python?

4 minutos de lectura

avatar de usuario
Javier V.

Estoy buscando la mejor manera (rápida y elegante) de obtener un booleano aleatorio en python (lanzar una moneda).

Por el momento estoy usando random.randint(0, 1) o random.getrandbits(1).

¿Hay mejores opciones de las que no soy consciente?

  • Esta es una pregunta buena y válida sobre el rendimiento de varias opciones para obtener un booleano aleatorio, pero siento que perdido en el ruido de todos los puntos de referencia es el hecho de que el mejor desempeño ahorra menos de un segundo en comparación con el peor desempeño en un millón iteraciones Si ha venido aquí buscando una forma de acelerar una aplicación, probablemente debería buscar otras opciones primero.

    – Ian McLaird

    15 oct 2020 a las 14:16

avatar de usuario
Juan La Rooy

La respuesta de Adam es bastante rápida, pero descubrí que random.getrandbits(1) ser mucho más rápido. Si realmente quieres un booleano en lugar de un largo, entonces

bool(random.getrandbits(1))

sigue siendo aproximadamente el doble de rápido que random.choice([True, False])

Ambas soluciones deben import random

Si la máxima velocidad no es una prioridad, entonces random.choice definitivamente se lee mejor.

Tenga en cuenta que random.choice() es más lento que solo choice() (después from random import choice) debido a la búsqueda de atributos.

$ python3 --version
Python 3.9.7
$ python3 -m timeit -s "from random import choice" "choice([True, False])"
1000000 loops, best of 5: 376 nsec per loop
$ python3 -m timeit -s "from random import choice" "choice((True, False))"
1000000 loops, best of 5: 352 nsec per loop
$ python3 -m timeit -s "from random import getrandbits" "getrandbits(1)"
10000000 loops, best of 5: 33.7 nsec per loop
$ python3 -m timeit -s "from random import getrandbits" "bool(getrandbits(1))"
5000000 loops, best of 5: 89.5 nsec per loop
$ python3 -m timeit -s "from random import getrandbits" "not getrandbits(1)"
5000000 loops, best of 5: 46.3 nsec per loop
$ python3 -m timeit -s "from random import random" "random() < 0.5"
5000000 loops, best of 5: 46.4 nsec per loop

  • Si lo que nos interesa es el rendimiento, not not random.getrandbits(1)) es más rápido que bool 😉

    – Michael Bentkowski

    26 de julio de 2011 a las 9:38

  • Es probable que ni siquiera necesite convertir a un valor booleano, ya que 0/1 tiene los valores de verdad adecuados.

    – Adam Vandenberg

    26 de julio de 2011 a las 16:46

  • Podrías acelerarlo aún más haciendo from random import getrandbits para evitar la búsqueda de atributos. 🙂

    – tipo todo

    26 de julio de 2011 a las 23:07

  • en realidad, la búsqueda de atributos faltantes parece ser la razón por la cual random() < 0.5 es el más rápido Cuando usas from random import getrandbits getrandbits es más rápido que random() < 0.5.

    – jl005

    22 de febrero de 2021 a las 15:27

avatar de usuario
Adán Vandenberg

import random
random.choice([True, False])

también funcionaría.

  • ¿Necesito importar alguna biblioteca?

    – Hola

    8 de octubre de 2021 a las 2:54

  • Sólo random. Es parte de la biblioteca estándar.

    – castis

    11 de noviembre de 2021 a las 1:18


  • De hecho, lo mismo random utilizado por la mayoría de las otras respuestas aquí.

    – Karl Knechtel

    11 de noviembre de 2021 a las 1:28

avatar de usuario
pavel radchenko

Encontré un método más rápido:

$ python -m timeit -s "from random import getrandbits" "not getrandbits(1)"
10000000 loops, best of 3: 0.222 usec per loop
$ python -m timeit -s "from random import random" "True if random() > 0.5 else False"
10000000 loops, best of 3: 0.0786 usec per loop
$ python -m timeit -s "from random import random" "random() < 0.5"
10000000 loops, best of 3: 0.0579 usec per loop

  • random() > 0.5 ya se evalúa como un valor booleano que es incluso más rápido.

    – John LaRooy

    8 de marzo de 2014 a las 9:15

  • random() >= 0.5de lo contrario, estará un poco sesgado hacia False.

    – Simón Lindholm

    17/03/2014 a las 22:42

  • random() < 0.5 tiene más sentido ya que cambiar 0.5 a alguna otra probabilidad funciona como se esperaba

    – akxlr

    7 de noviembre de 2015 a las 11:24

  • Cambiado a random() < 0.5gracias @SimonLindholm y @akxlr.

    – Pavel Radchenko

    11 de junio de 2021 a las 10:56

Si desea generar una cantidad de valores booleanos aleatorios, puede usar el módulo aleatorio de numpy. Desde el documentación

np.random.randint(2, size=10)

devolverá 10 enteros uniformes aleatorios en el intervalo abierto [0,2). The size keyword specifies the number of values to generate.

I like

 np.random.rand() > .5

user avatar
ojunk

I was curious as to how the speed of the numpy answer performed against the other answers since this was left out of the comparisons. To generate one random bool this is much slower but if you wanted to generate many then this becomes much faster:

$ python -m timeit -s "from random import random" "random() < 0.5"
10000000 loops, best of 3: 0.0906 usec per loop
$ python -m timeit -s "import numpy as np" "np.random.randint(2, size=1)"
100000 loops, best of 3: 4.65 usec per loop

$ python -m timeit -s "from random import random" "test = [random() < 0.5 for i in range(1000000)]" 10 bucles, lo mejor de 3: 118 mseg por bucle $ python -m timeit -s "import numpy as np" "test = np.random.randint(2, size=1000000)" 100 bucles, lo mejor de 3: 6,31 mseg por bucle

avatar de usuario
Partiban

Podrías usar el biblioteca fakerse usa principalmente para pruebas, pero es capaz de proporcionar una variedad de datos falsos.

Instalar: https://pypi.org/project/Faker/

>>> from faker import Faker
>>> fake = Faker()
>>> fake.pybool()
True

¿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