这是因为 1 到 10**12 之间的大多数数字都有 12 位数字。具体来说,1 到 10^12 之间的数字中有 90% 有 12 位。然后 9% 有 11 位数字;只有 1% 的人有 10 位数或更少。
- 9 个数字有 1 个数字 (1-9);
- 90个数字有2位数字(10-99);
- 900个号码有3位数字(100-999);
- 9000个号码有4位数字(1000-9999);
- ...
- 9 * 10**10 个数字有 11 位数字(10000000000-99999999999);
- 9 * 10**11 个数字有 12 位(100000000000-999999999999);
- 1 个号码有 13 位数字 (1000000000000)。
如果你愿意,你可以尝试绘制一个直方图,显示有多少个数字,当随机生成1到10**12之间的大量数字时:
import random
import matplotlib.pyplot as plt
X = [random.randint(1,10**12) for _ in range(10000)]
nb_digits = [len(str(x)) for x in X]
plt.hist(nb_digits, bins=range(1,14), density=True)
plt.show()
另一种思考方式:前导零
在0 和10**12 - 1 之间均匀随机生成一个数字与在0 到9 之间均匀随机生成12 位数字,然后将它们连接起来以10 为底编写一个数字。
所得数字的“位数”将是 12减去前导零的个数。
例如,字符串000000049608 算作一个 5 位数字,因为前 7 位数字为零。
因此,如果生成的最左边的数字不是 0,则生成的数字将计为 12 位数字。只要第一个数字是 1、2、3、4、5、6、7、8 或 9,就会发生这种情况,这是 90% 的时间。
像上面那样,得到一个 5 位或更少的数字的概率是多少?这是最左边 7 位数字全为零的概率。发生这种情况的概率是 (1/10)**7 = 0.00001%。如您所见,大多数数字没有很多前导零。
如果您想倾斜分布以获得更多位数的多样性
也许您不希望随机数服从均匀分布?试试这个:
import random
number_of_numbers = 100
numberPower = 12
numbers = []
for _ in range(100):
randomNumberOfDigits = random.randint(1, numberPower)
randomNumber = random.randint(10**(randomNumberOfDigits - 1), 10**randomNumberOfDigits - 1)
numbers.append(randomNumber)
print(numbers)
# [4, 42, 6004, 2, 46111, 2023179648, 41991462, 525, 2412, 221700769, 47, 5304427, 102, 23, 54323975, 906, 894363079057, 556, 675354, 9365725, 838, 490947621, 82648961, 9232330, 2885693, 28889965, 31601, 505250081, 534874, 85, 4630, 5, 8088582, 67921960, 722774315903, 16, 33, 7752943, 16628713055, 74, 2561429212, 67626556043, 155962, 596, 8655352595, 4735, 7, 8296258, 17722, 78, 93044214350, 17247469, 58295330, 622, 332, 450232321717, 70292459, 11, 447064711120, 895793, 8, 540110, 43032518210, 7, 20361, 606, 9, 9943927, 983, 54327, 40473362991, 2358, 7102932592, 15960846, 99385316379, 88654316391, 219692155, 3732404, 5474, 6343805291, 74, 844532493412, 2, 45228, 186785825, 10704, 4833, 744164008354, 976046952, 7836, 49344611762, 34985277, 362, 49577, 868571104, 237506, 2, 920019513002, 83847, 77908803]
注意:我选择写** 来表示电源而不是^,因为我们使用python 代码进行说明,而在python 中,** 表示电源,而^ 表示完全不同的东西。