ฉันกำลังมองหาวิธีที่ดีที่สุด (เร็วและสวยงาม) เพื่อรับบูลีนแบบสุ่มในหลาม (พลิกเหรียญ)
สำหรับช่วงเวลาที่ฉันใช้หรือrandom.randint(0, 1)
random.getrandbits(1)
มีทางเลือกที่ดีกว่าที่ฉันไม่ทราบหรือไม่?
ฉันกำลังมองหาวิธีที่ดีที่สุด (เร็วและสวยงาม) เพื่อรับบูลีนแบบสุ่มในหลาม (พลิกเหรียญ)
สำหรับช่วงเวลาที่ฉันใช้หรือrandom.randint(0, 1)
random.getrandbits(1)
มีทางเลือกที่ดีกว่าที่ฉันไม่ทราบหรือไม่?
คำตอบ:
คำตอบของอดัมนั้นค่อนข้างเร็ว แต่ฉันพบว่า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
from random import getrandbits
เพื่อหลีกเลี่ยงการค้นหาแอตทริบิวต์ :-)
random.choice([True, False])
ก็จะทำงานเช่นกัน
พบวิธีที่เร็วกว่า:
$ 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
random() > 0.5
ประเมินค่าบูลแล้วซึ่งเร็วขึ้นกว่าเดิม!
random() >= 0.5
มิฉะนั้นคุณจะรู้สึกลำเอียงเล็กน้อยต่อเท็จ
random() < 0.5
ทำให้มีเหตุผลมากขึ้นเมื่อเปลี่ยน 0.5 เป็นความน่าจะเป็นอื่น ๆ ตามที่คาดไว้
ฉันชอบ
np.random.rand() > .5
หากคุณต้องการสร้างบูลีนสุ่มจำนวนหนึ่งคุณสามารถใช้โมดูลสุ่มของนัมมี่ได้ จากเอกสารประกอบ
np.random.randint(2, size=10)
จะส่งกลับจำนวนเต็ม 10 ชุดแบบสุ่มในช่วงเวลาที่เปิด [0,2) size
คำหลักระบุจำนวนของค่าในการสร้าง
ฉันอยากรู้ว่าความเร็วของคำตอบ 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
คุณสามารถใช้ห้องสมุด Fakerซึ่งส่วนใหญ่ใช้สำหรับการทดสอบ แต่สามารถให้ข้อมูลปลอมได้หลากหลาย
ติดตั้ง: https://pypi.org/project/Faker/
>>> from faker import Faker
>>> fake = Faker()
>>> fake.pybool()
True
ใหม่ใช้เวลากับคำถามนี้จะเกี่ยวข้องกับการใช้งานของ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)
fake.boolean()
ไวยากรณ์สะอาดและง่ายสำหรับคนอื่น ๆ เพื่อ grok
not not random.getrandbits(1))
เร็วกว่าbool
;)