2011-07-26 18 views
133

Estoy buscando la mejor manera (rápida y elegante) para obtener un booleano al azar en python (lanzar una moneda).Obtener un booleano al azar en python?

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

¿Hay mejores opciones de las que no tengo conocimiento?

Respuesta

202

La respuesta de Adam es bastante rápida, pero encontré que random.getrandbits(1) es mucho más rápido. Si realmente quieres un valor lógico en lugar de una larga continuación

bool(random.getrandbits(1)) 

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

Ambas soluciones tienen que import random

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

$ python -m timeit -s "import random" "random.choice([True, False])" 
1000000 loops, best of 3: 0.904 usec per loop 
$ python -m timeit -s "import random" "random.choice((True, False))" 
1000000 loops, best of 3: 0.846 usec per loop 
$ python -m timeit -s "import random" "random.getrandbits(1)" 
1000000 loops, best of 3: 0.286 usec per loop 
$ python -m timeit -s "import random" "bool(random.getrandbits(1))" 
1000000 loops, best of 3: 0.441 usec per loop 
$ python -m timeit -s "import random" "not random.getrandbits(1)" 
1000000 loops, best of 3: 0.308 usec per loop 
$ python -m timeit -s "from random import getrandbits" "not getrandbits(1)" 
1000000 loops, best of 3: 0.262 usec per loop # not takes about 20us of this 

Agregado éste después de ver la respuesta de @ Pavel

$ python -m timeit -s "from random import random" "random() < 0.5" 
10000000 loops, best of 3: 0.115 usec per loop 
+6

Si todos estamos sobre el rendimiento, 'No, no random.getrandbits (1))' 'es más rápido que bool';) –

+23

@Michal , un solo 'no' funciona igual de bien en este caso –

+8

Es probable que ni siquiera necesite convertir a booleano, ya que 0/1 tiene los valores de verdad correctos. –

108
random.choice([True, False]) 

también funcionaría.

+10

podría ser un poco más lento pero mucho más fácil de leer ... –

4

Si desea generar un número de booleanos aleatorios, puede usar el módulo aleatorio de numpy. Desde el documentation

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

devolverá 10 enteros aleatoria uniforme en el intervalo abierto [0,2). La palabra clave size especifica el número de valores para generar.

3

me gusta

np.random.rand() > .5 
21

encontrado 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 
+2

'random()> 0.5' ya se evalúa a un bool que es aún más rápido! –

+0

¡Tienes razón! Es mucho más rápido :) He actualizado la respuesta. –

+16

'random()> = 0.5', de lo contrario serás un poco parcial hacia False. –

-1

Una nueva toma en esta cuestión implicaría el uso de Faker que se puede instalar fácilmente con pip.

from faker import Factory 

#---------------------------------------------------------------------- 
def create_values(fake): 
    """""" 
    print fake.boolean(chance_of_getting_true=50) # True 
    print fake.random_int(min=0, max=1) # 1 

if __name__ == "__main__": 
    fake = Factory.create() 
    create_values(fake) 
+6

Al menos debe explicar por qué cree que esta es una solución mejor, considerando que implica descargar un paquete diferente y es más complicado. – Bzazz

+0

No estoy de acuerdo con los votos a favor. Si está creando datos aleatorios, es posible que se encuentre en una situación en la que Faker es una herramienta muy útil. La sintaxis 'fake.boolean()' es limpia y fácil de asimilar para otros. –