【问题标题】:Python randint generates numbers with the same number of digitsPython randint 生成具有相同位数的数字
【发布时间】:2021-01-29 19:45:57
【问题描述】:
for i in range(number_of_numbers):
 randomNumber = randint(1, pow(10, numberPower))
 numbers.append(randomNumber)
 numbersIncreasing.append(randomNumber)

所以我正在制作一个小数学游戏,它会根据用户输入生成 n 个数字。这是生成数字并将它们附加到列表的代码。唯一的问题是,它是否给出了具有相同位数的数字,即 numberPower 设置为 (12)。一个例子是两个数字,如 9,564,713,666,123 或 1,256,286,233,753,所有数字都有 12 位。我期待更多非常复杂的数字,实际上可能在 1 到 10^12 之间。

【问题讨论】:

  • 如果您希望 randint 生成 10 到 1000 之间的 10 个数字,大多数数字将是 3 位长,只是因为机会。如果您要生成一个介于 1 和 1000000 之间的数字,它很可能是 6 位数字。我想说的是:这些数字不会都是 12 位数长,但它们是偶然的。
  • yepp...获得一位数字的机会...9 / 10**12...不会经常发生。

标签: python math random


【解决方案1】:

这是因为 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()

另一种思考方式:前导零

010**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 中,** 表示电源,而^ 表示完全不同的东西。

【讨论】:

  • ...不错的补充...虽然只是部分相关,但也让我想起了Benford's law
  • @mikuszefski Benford 的卡通定律:xkcd.com/1103
猜你喜欢
  • 2018-08-07
  • 2021-12-17
  • 1970-01-01
  • 2020-11-24
  • 2015-05-24
  • 1970-01-01
  • 2017-07-30
  • 2021-12-31
相关资源
最近更新 更多