Python'da rastgele bir boole mi alıyorsunuz?


244

Python'da rastgele bir boole almak için en iyi yolu (hızlı ve zarif) arıyorum (bozuk para).

Şimdilik random.randint(0, 1)veya kullanıyorum random.getrandbits(1).

Farkında olmadığım daha iyi seçenekler var mı?

Yanıtlar:


332

Adam'ın cevabı oldukça hızlı, ama bunu random.getrandbits(1)çok daha hızlı buldum . Gerçekten uzun bir yerine bir boolean istiyorsanız

bool(random.getrandbits(1))

hala yaklaşık iki kat daha hızlı random.choice([True, False])

Her iki çözüm de import random

En yüksek hız öncelikli değilse, random.choicekesinlikle daha iyi okunur

$ 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

@ Pavel'in cevabını gördükten sonra bunu ekledim

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

14
Eğer performansla not not random.getrandbits(1))bool
ilgiliysek

11
0/1 doğru gerçek değerlere sahip olduğundan, muhtemelen bir boole'ye bile ihtiyacınız yoktur.
Adam Vandenberg

6
from random import getrandbitsÖzellik aramasını önlemek için bunu daha da hızlandırabilirsiniz . :-)
kindall


40

Daha hızlı bir yöntem bulundu:

$ 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.5zaten daha hızlı bir boole değerlendiriyor!
John La Rooy

26
random() >= 0.5Aksi takdirde, False'a karşı biraz önyargılı olacaksınız.
Simon Lindholm

17
random() < 0.5beklendiği gibi diğer olasılıklara 0,5 olarak değiştirme daha mantıklı
akxlr


8

Bir dizi rastgele boole üretmek istiyorsanız numpy'nin rastgele modülünü kullanabilirsiniz. Gönderen dokümantasyon

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

açık aralıkta 10 rasgele düzgün tamsayı döndürür [0,2). sizeAnahtar kelime belirtir değerlerin sayısı üretmek için.


Bu yöntemin karşılaştırmalar dışında kaldığından, bu yöntemin hızının cevaplara karşı nasıl performans gösterdiğini merak ettim. Bir rastgele bool (ki bu soru) oluşturmak için bu çok daha yavaştır ancak çok sayıda üretmek istiyorsanız bu daha hızlı sonuç verir: $ python -m timeit -s "rastgele içe aktarma rastgele" "random () <0.5" 10000000 loop , en iyi 3: döngü başına 0.0906 usec
ojunk

2

Karşılaştırmaların dışında bırakıldığından, numpy cevabının diğer cevaplara karşı nasıl bir performans gösterdiğini merak ettim. Bir rastgele bool üretmek için bu çok daha yavaştır, ancak çok sayıda üretmek istiyorsanız, bu çok daha hızlı hale gelir:

$ 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

Bu soruya yeni bir bakış , kolayca kurabileceğiniz Faker kullanımını içerecektir 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
En azından farklı bir paket indirmeyi ve daha karışık olduğunu düşünerek bunun neden daha iyi bir çözüm olduğunu düşündüğünüzü açıklamalısınız.
Bzazz

2
Downvotes ile katılmıyorum. Rasgele veri oluşturuyorsanız, Faker'in çok faydalı bir araç olduğu bir durumda olabilirsiniz. fake.boolean()Sözdizimi diğerleri grok için temiz ve kolaydır.
Jason McVetta

3
Paketin yararlı olup olmadığına bakılmaksızın, bunun neden düşünülmesi gerektiğine dair tam bir açıklama eksikliği cevabı işe yaramaz hale getirir.
Apollys, Monica
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.