Pythonでランダムなブール値を取得しますか?


244

私はpythonでランダムなブール値を取得する(コインを弾く)ための最良の方法(高速かつエレガント)を探しています。

現時点では、random.randint(0, 1)またはを使用していrandom.getrandbits(1)ます。

私が知らないより良い選択肢はありますか?

回答:


332

Adamの答えは非常に速いですが、私はそれrandom.getrandbits(1)がはるかに速いことがわかりました。あなたが本当に長いのではなくブール値が欲しいなら

bool(random.getrandbits(1))

それでも約2倍速いです 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 '26 / 07/26

11
0/1には適切な真理値があるため、ブール値にキャストする必要すらありません。
Adam Vandenberg

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はさらに高速なブールに評価されます!
John La Rooy、2014年

26
random() >= 0.5そうでなければ、Falseに偏った小さなビットになります。
Simon Lindholm 2014年

17
random() < 0.50.5を他の確率に変更すると予想どおりに機能するため、より理にかなっています
akxlr


8

多数のランダムなブール値を生成したい場合は、numpyのランダムモジュールを使用できます。ドキュメントから

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

は、開いている間隔[10,2)で10個のランダムな均一整数を返します。sizeキーワードが生成する値の数を指定します。


このオプションは比較から除外されているので、この方法の速度が回答に対してどのように実行されるかについて知りたいと思いました。1つのランダムなブールを生成するには(これは問題です)、これははるかに遅くなりますが、多くを生成したい場合、これははるかに速くなります:$ python -m timeit -s "from random import random" "random()<0.5" 10000000 loops 、ベスト3:ループごとに0.0906 usec
ジャンク2018

2

これは比較から除外されているため、派手な回答が他の回答に対してどのように実行されるかについて、私は興味を持っていました。1つのランダムなブール値を生成するには、これははるかに遅くなりますが、多くを生成したい場合は、はるかに速くなります。

$ 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

この質問に対する新しい見方は、で簡単にインストールできる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
別のパッケージをダウンロードする必要があり、煩雑であることを考慮して、少なくともこれがより良いソリューションであると考える理由を説明する必要があります。
Bzazz

2
私は反対票に同意しません。ランダムなデータを作成している場合、Fakerが非常に役立つツールである可能性があります。fake.boolean()構文は、他の人が完全に理解するために、クリーンで簡単です。
Jason McVetta 2017

3
パッケージが有用かどうかに関係なく、なぜこれを検討する必要があるかについての説明が完全に欠如しているため、答えは役に立たなくなります。
Apollysは、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.