繁体   English   中英

如何生成介于最小和最大位数之间的随机数? (Python)

[英]How to generate a random number between a minimum and maximum number of digits? (Python)

例如,用户可以指定最少 2(两位数)和最多 4(四位数),并且数字必须介于 10 和 9999 之间。输入始终为 integer。

我已经设法做到这一点,以便数字始终具有最大位数,但我无法弄清楚如何包含最小数字。

想到的第一种方法是将所需的数字位数转换为整数; 即,如果您想要最少 9 位数字,则此类数字的最大值为 999,999,999,因为这是最大的 9 位数字。 如果你想要最少 2 位数字,那么这样的数字的最小值为 10,因为这是最小的 2 位数字。

弄清楚之后,您可以使用十的幂来计算所需的范围:

mindigits = 2
maxdigits = 9

num = random.randrange(10**(mindigits-1), 10**maxdigits)

并获得该范围内的数字。

但是您的很多号码都是 9 位数字,很少是 2 位数字。 事实上,您可能认为它总是通过随意测试生成长数字。 为什么? 因为 9 位数字的数量是 8 位数字的十倍,而 8 位数字的数量是 7 位数字的十倍,依此类推。 在那个范围内,两位数的数字是非常罕见的!

平均而言,以这种方式生成的 2 到 9 位之间的随机数中,大约 90% 的长度为 9 位,这意味着其他长度总共占 10%。 不相信我? 试试这个:

from collections import Counter
from random import randint
Counter(len(str(randint(10, 999_999_999))) for _ in range(999))

在我的机器上运行的示例产生了以下 output:

Counter({9: 906, 8: 87, 7: 5, 5: 1})

因此,在这次运行中生成的 1000 个随机数中,没有长度为 2、3、4 或 6 的随机数。

如果您想要数字位数的均匀分布,请单独生成数字。 唯一的技巧是,您生成的第一个数字不能为零,因此您需要从 1-9 的范围内生成它。 所以我们从 rest 中单独生成一个。我们可以使用生成器表达式生成其他数字,将所有内容组合成一个字符串,然后将其转换为 integer。

mindigits = 2
maxdigits = 9

num = int(str(random.randint(1, 9)) + "".join(str(random.randint(0, 9)) 
        for _ in range(random.randrange(mindigits-1, maxdigits))))

使用random.randint()

import random

min_digits = # enter here
max_digits = # enter here

# This is how you can turn the minimum and maximum number of digits into the range for the final number
min_value = 10**(min_digits - 1)
max_value = (10**max_digits) - 1

# Input these values into the randint function
print(random.randint(min_value, max_value))

使用randrange(start, stop)

另外,您可能需要像start = 10 ** 2stop = 10 ** 4这样的表达式来描述具有特定位数的数字。

确保导入 math、random 和 randint 模块/库:

random.randint(10,9999)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM