अजगर में एक यादृच्छिक बूलियन जाओ?


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

@ पावेल के उत्तर को देखने के बाद इसे जोड़ा गया

$ 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;)
मिचेल बेंटकोवस्की

11
आपको संभवतः एक बूलियन को डालने की आवश्यकता नहीं है, क्योंकि 0/1 में उचित सत्य मूल्य हैं।
एडम वंडेनबर्ग

6
आप from random import getrandbitsविशेषता लुकअप से बचने के लिए इसे और तेज़ कर सकते हैं । :-)
२३:०६ ​​पर टाइप करें


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पहले से ही एक बूल का मूल्यांकन करता है जो और भी तेज है!
जॉन ला रोय

26
random() >= 0.5, अन्यथा आप झूठे की ओर एक छोटे से पक्षपाती होंगे।
साइमन लिंडहोम

17
random() < 0.50.5 के रूप में कुछ अन्य संभावना को बदलने के रूप में अधिक समझ में आता है उम्मीद के
मुताबिक


8

यदि आप कई यादृच्छिक बूलियन उत्पन्न करना चाहते हैं, तो आप सुपीरियर के यादृच्छिक मॉड्यूल का उपयोग कर सकते हैं। से प्रलेखन

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

खुले अंतराल [0,2) में 10 यादृच्छिक वर्दी पूर्णांक लौटाएगा। sizeकीवर्ड निर्दिष्ट मानों की संख्या उत्पन्न करने के लिए।


मुझे इस बात की उत्सुकता थी कि इस पद्धति की गति ने उत्तरों के खिलाफ प्रदर्शन कैसे किया क्योंकि यह विकल्प तुलनाओं से बचा हुआ था। एक यादृच्छिक बूल उत्पन्न करने के लिए (जो प्रश्न है) यह बहुत धीमा है, लेकिन अगर आप कई उत्पन्न करना चाहते हैं तो यह बहुत तेजी से mecomes: $ python -m timeit -s "यादृच्छिक आयात यादृच्छिक" "यादृच्छिक" () <0.5 से 10000000 लूप्स , बेस्ट ऑफ़ 3: 0.0906 usec प्रति लूप
ojunk

2

मैं इस बात से उत्सुक था कि तुलनात्मक उत्तर देने के बाद से अन्य उत्तरों के मुकाबले नुकीले उत्तर की गति कैसे हो गई। एक यादृच्छिक बूल उत्पन्न करने के लिए यह बहुत धीमा है लेकिन अगर आप कई उत्पन्न करना चाहते हैं तो यह बहुत तेज हो जाता है:

$ 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

1

आप फ़ेकर लाइब्रेरी का उपयोग कर सकते हैं , यह मुख्य रूप से परीक्षण के लिए उपयोग किया जाता है, लेकिन विभिन्न प्रकार के नकली डेटा प्रदान करने में सक्षम है।

स्थापित करें: https://pypi.org/project/Faker/

>>> from faker import Faker
>>> fake = Faker()
>>> fake.pybool()
True

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
आपको कम से कम यह समझाना चाहिए कि आपको क्यों लगता है कि यह एक बेहतर समाधान है, इस पर विचार करने के लिए एक अलग पैकेज डाउनलोड करना और गड़बड़ है।
बाज़

2
मैं पतन से असहमत हूं। यदि आप यादृच्छिक डेटा बना रहे हैं, तो आप अच्छी तरह से उस स्थिति में हो सकते हैं जहाँ Faker बहुत उपयोगी उपकरण है। fake.boolean()वाक्य रचना स्वच्छ और आसान दूसरों grok करने के लिए है।
जेसन मैकविटा

3
भले ही पैकेज उपयोगी हो या न हो, लेकिन इस बारे में स्पष्टीकरण का पूर्ण अभाव कि किसी को इस पर विचार क्यों करना चाहिए, इससे उत्तर बेकार हो जाता है।
अपोलो मोनिका
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.