파이썬에서 임의의 부울을 얻습니까?


244

파이썬에서 임의의 부울을 얻는 가장 좋은 방법 (빠르고 우아함)을 찾고 있습니다 (동전 던지기).

현재 또는를 사용 random.randint(0, 1)하고 random.getrandbits(1)있습니다.

내가 모르는 더 나은 선택이 있습니까?

답변:


332

Adam의 답변은 매우 빠르지 만 random.getrandbits(1)상당히 빠릅니다. 정말로 long 대신 부울을 원한다면

bool(random.getrandbits(1))

여전히 약 두 배나 빠릅니다 random.choice([True, False])

두 솔루션 모두 import random

최대한의 속도가 우선 순위가 아니면 random.choice확실히 더 잘 읽습니다.

$ 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의 답변을 본 후에 이것을 추가했습니다.

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

14
우리가 성능에 관한 모든 not not random.getrandbits(1))것보다 빠르 다면 bool;)
Michał Bentkowski

11
0/1에는 올바른 진리 값이 있으므로 부울로 캐스트 할 필요조차 없습니다.
Adam Vandenberg

6
from random import getrandbits속성 조회를 피 함으로써 속도를 더욱 높일 수 있습니다. :-)
kindall


40

더 빠른 방법을 찾았습니다.

$ 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.5이미 더 빠른 부울로 평가됩니다!
John La Rooy

26
random() >= 0.5그렇지 않으면 False를 향한 작은 편향이 될 것입니다.
Simon Lindholm

17
random() < 0.5예상대로 다른 확률 작품에 0.5을 변경하는 등 더 의미
akxlr


8

다수의 임의의 부울을 생성하려면 numpy의 임의 모듈을 사용할 수 있습니다. 로부터 문서

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

열린 간격 [0,2)에서 10 개의 임의의 균일 한 정수를 반환합니다. size키워드 지정 값의 수를 생성합니다.


이 옵션이 비교에서 제외 되었으므로이 방법의 속도가 답변에 대해 어떻게 수행되는지 궁금합니다. 하나의 임의의 부울을 생성하려면 (이것은) 속도가 훨씬 느리지 만 많은 것을 생성하려면 훨씬 빨리 나옵니다. $ python -m timeit -s "random () <0.5"10000000 루프 , 최고 3 : 3 : 루프 당 0.0906 usec
ojunk

2

나는 이것이 비교에서 제외 된 이후 다른 답변에 비해 numpy 답변의 속도가 어떻게 수행되는지 궁금했습니다. 하나의 임의의 부울을 생성하려면 속도가 훨씬 느리지 만 많은 것을 생성하려면 훨씬 빠릅니다.

$ 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

이 질문에 대한 새로운 내용은 Faker 를 사용 하여 쉽게 설치할 수 있습니다 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
다른 패키지를 다운로드하고 더 지저분하다는 것을 고려할 때 왜 이것이 더 나은 솔루션이라고 생각하는지 설명해야합니다.
Bzazz

2
나는 downvotes에 동의하지 않습니다. 임의의 데이터를 생성하는 경우 Faker가 매우 유용한 도구 일 수 있습니다. fake.boolean()구문은 다른 사람이 grok 수하기 위해 깨끗하고 간단합니다.
Jason McVetta

3
패키지가 유용한 지 여부에 관계없이 왜 고려해야하는지에 대한 완전한 설명이 없기 때문에 대답이 쓸모가 없습니다.
Apollys는 Monica
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.