Dapatkan boolean acak dengan python?


244

Saya mencari cara terbaik (cepat dan elegan) untuk mendapatkan boolean acak dengan python (flip a coin).

Untuk saat ini saya menggunakan random.randint(0, 1)atau random.getrandbits(1).

Apakah ada pilihan yang lebih baik yang tidak saya sadari?

Jawaban:


332

Jawaban Adam cukup cepat, tetapi ternyata random.getrandbits(1)lebih cepat. Jika Anda benar-benar menginginkan boolean, bukan lama

bool(random.getrandbits(1))

masih sekitar dua kali lebih cepat random.choice([True, False])

Kedua solusi perlu import random

Jika kecepatan maksimal bukan prioritas maka random.choicepasti membaca lebih baik

$ 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

Menambahkan ini setelah melihat jawaban @ Pavel

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

14
Jika kita semua tentang kinerja, not not random.getrandbits(1))lebih cepat dari bool;)
Michał Bentkowski

11
Anda bahkan mungkin tidak perlu menggunakan boolean sama sekali, karena 0/1 memiliki nilai kebenaran yang tepat.
Adam Vandenberg

6
Anda bisa mempercepatnya lebih jauh dengan melakukan from random import getrandbitsuntuk menghindari pencarian atribut. :-)
kindall


40

Menemukan metode yang lebih cepat:

$ 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

3
random() > 0.5sudah dievaluasi menjadi bool yang bahkan lebih cepat!
John La Rooy

26
random() >= 0.5, jika tidak, Anda akan sedikit bias terhadap False.
Simon Lindholm

17
random() < 0.5lebih masuk akal karena mengubah 0,5 ke beberapa probabilitas lain berfungsi seperti yang diharapkan
akxlr


8

Jika Anda ingin menghasilkan sejumlah boolean acak, Anda bisa menggunakan modul acak numpy. Dari dokumentasi

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

akan mengembalikan 10 bilangan bulat seragam acak dalam interval terbuka [0,2). Kata sizekunci menentukan jumlah nilai yang akan dihasilkan.


Saya ingin tahu bagaimana kecepatan metode ini dilakukan terhadap jawaban karena opsi ini tidak dimasukkan dalam perbandingan. Untuk menghasilkan satu bool acak (yang merupakan pertanyaan) ini jauh lebih lambat tetapi jika Anda ingin menghasilkan banyak maka ini menjadi jauh lebih cepat: $ python -m timeit -s "dari acak impor acak" "acak () <0,5" 10000000 loop , terbaik dari 3: 0,0906 usec per loop
ojunk

2

Saya ingin tahu bagaimana kecepatan jawaban numpy dilakukan terhadap jawaban lain karena ini tidak disertakan dalam perbandingan. Untuk menghasilkan satu bool acak ini jauh lebih lambat tetapi jika Anda ingin menghasilkan banyak bool maka ini menjadi jauh lebih cepat:

$ 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 loops, best of 3: 118 msec per loop
$ python -m timeit -s "import numpy as np" "test = np.random.randint(2, size=1000000)"
100 loops, best of 3: 6.31 msec per loop


0

Pandangan baru tentang pertanyaan ini akan melibatkan penggunaan Faker yang dapat Anda instal dengan mudah 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)

14
Setidaknya Anda harus menjelaskan mengapa menurut Anda ini adalah solusi yang lebih baik, mengingat ini melibatkan pengunduhan paket yang berbeda dan lebih berantakan.
Bzazz

2
Saya tidak setuju dengan downvotes. Jika Anda membuat data acak, Anda mungkin berada dalam situasi di mana Faker adalah alat yang sangat berguna. The fake.boolean()sintaks bersih dan mudah bagi orang lain untuk grok.
Jason McVetta

3
Terlepas dari apakah paket itu berguna atau tidak, sama sekali tidak ada penjelasan mengapa seseorang harus mempertimbangkan ini membuat jawaban tidak berguna.
Apollys mendukung Monica
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.