在Python中,有两种显而易见的方法可以生成一个从0到9的随机数字。一个可以生成一个介于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
将其转换为以10为基数,势必会引起问题。例如1位浮点尾数b0 -> 1.0
和b1 -> 1.5
。“最后一位”将始终为0
或5
。
random.randrange(10)
恕我直言,这一点更加明显。random.randint
(random.randrange
在幕后调用)是该random
模块的新增内容,适用于不了解范围在Python中如何工作的人们。;)
randrange
在他们认为randint
界面有误之后,实际上排在第二位。