2011-07-26 105 views
133

我正在尋找最好的方法(快速和優雅)來獲得一個隨機布爾在python(翻轉硬幣)。在python中獲取一個隨機布爾值?

目前我正在使用random.randint(0, 1)random.getrandbits(1)

有沒有更好的選擇,我不知道?

回答

202

亞當的答案相當快,但我發現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 
+6

如果我們所有關於性能,'不是沒有random.getrandbits(1))'是比'bool'更快;) –

+23

@Michal ,在這種情況下單個'not'就可以工作 –

+8

因爲0/1具有正確的真值,所以根本不需要轉換爲布爾值。 –

108
random.choice([True, False]) 

也可以工作。

+10

可能會有點慢,但很多更具可讀性... –

4

如果你想生成一些隨機布爾值,你可以使用numpy的隨機模塊。從documentation

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

將在開區間[0,2)返回10個隨機均勻整數。 size關鍵字指定要生成的值的數量。

3

我喜歡

np.random.rand() > .5 
21

找到一個更快的方法:

$ 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 
+2

'隨機()> 0.5'已經評估爲更快的布爾! –

+0

你是對的!它更快:)我已經更新了答案。 –

+16

'random()> = 0.5',否則你會偏向False。 –

-1

的新嘗試對這個問題會涉及使用法克爾,你可以用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) 
+6

您至少應該解釋爲什麼您認爲這是一個更好的解決方案,因爲它涉及下載不同的包並且更混亂。 – Bzazz

+0

我不同意downvotes。如果你正在創建隨機數據,你很可能處於Faker是一個非常有用的工具的情況。 'fake.boolean()'語法對其他人來說乾淨而且容易。 –