web-dev-qa-db-ja.com

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

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

今のところ、random.randint(0, 1)またはrandom.getrandbits(1)を使用しています。

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

192
Xavier V.

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

bool(random.getrandbits(1))

まだrandom.choice([True, False])の約2倍の速度です

どちらのソリューションも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
271
John La Rooy
random.choice([True, False])

また動作します。

154
Adam Vandenberg

より速い方法を見つけました:

$ 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
34
Pavel Radchenko

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

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

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

6
Chris

好き

 np.random.Rand() > .5
5
Maarten

Numpyの回答の速度が他の回答と比較してどのように機能するかについては、これが比較に含まれていないため、興味がありました。 1つのランダムboolを生成するには、これは非常に遅くなりますが、多数を生成したい場合、これははるかに速くなります。

$ 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
ojunk