Pythonで0から9までのランダムな数字を生成するには、2つの明白な方法があります。0と1の間のランダムな浮動小数点数を生成し、10を掛け、切り捨てることができます。あるいは、このrandom.randint
方法を使用することもできます。
import random
def random_digit_1():
return int(10 * random.random())
def random_digit_2():
return random.randint(0, 9)
0から1までの乱数を生成し、最後の桁を保持した場合にどうなるかについて知りました。分布が均一であるとは必ずしも思っていませんでしたが、結果はかなり驚くべきものでした。
from random import random, seed
from collections import Counter
seed(0)
counts = Counter(int(str(random())[-1]) for _ in range(1_000_000))
print(counts)
出力:
Counter({1: 84206,
5: 130245,
3: 119433,
6: 129835,
8: 101488,
2: 100861,
9: 84796,
4: 129088,
7: 120048})
以下にヒストグラムを示します。末尾のゼロは切り捨てられるため、0は表示されないことに注意してください。しかし、数字4、5、6が他の数字よりも一般的である理由を誰かが説明できますか?Python 3.6.10を使用しましたが、Python 3.8.0a4でも結果は同じでした。
str
問題の原因となるbase-10に変換します。たとえば、1ビットの浮動小数b0 -> 1.0
とb1 -> 1.5
です。「最後の桁」は常に0
またはになり5
ます。
random.randrange(10)
私見はさらに明白です。random.randint
(random.randrange
内部で呼び出す)は、random
Pythonで範囲がどのように機能するかを理解していない人のために、モジュールに後で追加されました。;)
randrange
彼らが決定した後、実際には2番目に来randint
ました。