Nhận một boolean ngẫu nhiên trong python?


244

Tôi đang tìm kiếm cách tốt nhất (nhanh và thanh lịch) để có được một boolean ngẫu nhiên trong python (lật một đồng xu).

Hiện tại tôi đang sử dụng random.randint(0, 1)hoặc random.getrandbits(1).

Có những lựa chọn tốt hơn mà tôi không nhận thức được?

Câu trả lời:


332

Câu trả lời của Adam khá nhanh, nhưng tôi thấy rằng nó random.getrandbits(1)nhanh hơn khá nhiều. Nếu bạn thực sự muốn một boolean thay vì dài

bool(random.getrandbits(1))

vẫn nhanh gấp đôi random.choice([True, False])

Cả hai giải pháp cần phải import random

Nếu tốc độ tối đa không được ưu tiên thì random.choicechắc chắn đọc tốt hơn

$ 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

Đã thêm cái này sau khi thấy câu trả lời của @ Pavel

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

14
Nếu tất cả chúng ta về hiệu suất, not not random.getrandbits(1))thì nhanh hơn bool;)
Michał Bentkowski

11
Bạn thậm chí có thể không cần phải chuyển sang boolean, vì 0/1 có các giá trị chân lý phù hợp.
Adam Vandenberg

6
Bạn có thể tăng tốc hơn nữa bằng cách thực hiện from random import getrandbitsđể tránh tra cứu thuộc tính. :-)
kindall


40

Tìm thấy một phương pháp nhanh hơn:

$ 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đã đánh giá một bool mà thậm chí còn nhanh hơn!
John La Rooy

26
random() >= 0.5, nếu không, bạn sẽ có một chút thiên vị đối với Sai.
Simon Lindholm

17
random() < 0.5có ý nghĩa hơn khi thay đổi 0,5 thành một số xác suất khác hoạt động như mong đợi
akxlr


8

Nếu bạn muốn tạo một số booleans ngẫu nhiên, bạn có thể sử dụng mô-đun ngẫu nhiên của numpy. Từ tài liệu

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

sẽ trả về 10 số nguyên thống nhất ngẫu nhiên trong khoảng thời gian mở [0,2). Các sizequy định cụ thể từ khóa số của các giá trị để tạo ra.


Tôi tò mò về tốc độ của phương pháp này đối với các câu trả lời như thế nào vì tùy chọn này không được so sánh. Để tạo một bool ngẫu nhiên (đó là câu hỏi), điều này chậm hơn nhiều nhưng nếu bạn muốn tạo nhiều thì mecomes này nhanh hơn nhiều: $ python -m timeit -s "từ ngẫu nhiên nhập ngẫu nhiên" "ngẫu nhiên () <0,5" 10000000 vòng , tốt nhất trong 3: 0,0906 usec mỗi vòng lặp
ojunk

2

Tôi tò mò về tốc độ của câu trả lời khó hiểu đã thực hiện như thế nào so với các câu trả lời khác vì điều này bị bỏ qua so sánh. Để tạo một bool ngẫu nhiên, điều này chậm hơn nhiều nhưng nếu bạn muốn tạo nhiều thì điều này trở nên nhanh hơn nhiều:

$ 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

Một câu hỏi mới về câu hỏi này sẽ liên quan đến việc sử dụng Faker mà bạn có thể cài đặt dễ dàng 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
Ít nhất bạn nên giải thích lý do tại sao bạn nghĩ rằng đây là một giải pháp tốt hơn, xem xét nó liên quan đến việc tải xuống một gói khác và phức tạp hơn.
Bzazz

2
Tôi không đồng ý với các downvote. Nếu bạn đang tạo dữ liệu ngẫu nhiên, rất có thể bạn đang ở trong tình huống mà Faker là một công cụ rất hữu ích. Các fake.boolean()cú pháp là sạch sẽ và dễ dàng cho người khác để grok.
Jason McVetta

3
Bất kể gói đó có hữu ích hay không, việc thiếu giải thích hoàn toàn về lý do tại sao người ta nên xem xét điều này làm cho câu trả lời trở nên vô dụng.
Apollys hỗ trợ Monica
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.