รับบูลีนแบบสุ่มในหลามหรือไม่


244

ฉันกำลังมองหาวิธีที่ดีที่สุด (เร็วและสวยงาม) เพื่อรับบูลีนแบบสุ่มในหลาม (พลิกเหรียญ)

สำหรับช่วงเวลาที่ฉันใช้หรือrandom.randint(0, 1)random.getrandbits(1)

มีทางเลือกที่ดีกว่าที่ฉันไม่ทราบหรือไม่?

คำตอบ:


332

คำตอบของอดัมนั้นค่อนข้างเร็ว แต่ฉันพบว่าrandom.getrandbits(1)มันเร็วกว่ามาก หากคุณต้องการบูลีนจริงๆแทนที่จะเป็นแบบยาว

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มิฉะนั้นคุณจะรู้สึกลำเอียงเล็กน้อยต่อเท็จ
Simon Lindholm

17
random() < 0.5ทำให้มีเหตุผลมากขึ้นเมื่อเปลี่ยน 0.5 เป็นความน่าจะเป็นอื่น ๆ ตามที่คาดไว้
akxlr


8

หากคุณต้องการสร้างบูลีนสุ่มจำนวนหนึ่งคุณสามารถใช้โมดูลสุ่มของนัมมี่ได้ จากเอกสารประกอบ

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

จะส่งกลับจำนวนเต็ม 10 ชุดแบบสุ่มในช่วงเวลาที่เปิด [0,2) sizeคำหลักระบุจำนวนของค่าในการสร้าง


ฉันอยากรู้ว่าความเร็วของวิธีนี้ดำเนินการอย่างไรกับคำตอบเนื่องจากตัวเลือกนี้ไม่มีการเปรียบเทียบ ในการสร้างบูลสุ่มหนึ่งอัน (ซึ่งเป็นคำถาม) สิ่งนี้ช้ากว่ามาก แต่ถ้าคุณต้องการสร้างจำนวนมาก mecomes นี้จะเร็วขึ้นมาก: $ python -m timeit -s "จากการสุ่มนำเข้าแบบสุ่ม" "random () <0.5" 10000000 ลูป ดีที่สุดของ 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

ใหม่ใช้เวลากับคำถามนี้จะเกี่ยวข้องกับการใช้งานของFakerpipซึ่งคุณสามารถติดตั้งได้อย่างง่ายดายด้วย

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 สนับสนุนโมนิก้า
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.