如何生成具有特定位数的随机数?
- 2025-03-05 09:14:00
- admin 原创
- 98
问题描述:
假设我需要一个 3 位数字,那么它应该是这样的:
>>> random(3)
563
or
>>> random(5)
26748
>> random(2)
56
解决方案 1:
您可以使用 或random.randint
。random.randrange
因此,要获得一个随机的 3 位数字:
from random import randint, randrange
randint(100, 999) # randint is inclusive at both ends
randrange(100, 1000) # randrange is exclusive at the stop
假设您真正指的是三位数,而不是“最多三位数”。
要使用任意数量的数字:
from random import randint
def random_with_N_digits(n):
range_start = 10**(n-1)
range_end = (10**n)-1
return randint(range_start, range_end)
print random_with_N_digits(2)
print random_with_N_digits(3)
print random_with_N_digits(4)
输出:
33
124
5127
解决方案 2:
如果您希望将其作为字符串(例如,10 位电话号码),则可以使用此方法:
n = 10
''.join(["{}".format(randint(0, 9)) for num in range(0, n)])
解决方案 3:
如果您需要一个 3 位数字,并且希望 001-099 是有效数字,您仍应使用 randrange/randint,因为它比其他方法更快。只需在转换为字符串时添加必要的前导零即可。
import random
num = random.randrange(1, 10**3)
# using format
num_with_zeros = '{:03}'.format(num)
# using string's zfill
num_with_zeros = str(num).zfill(3)
或者,如果您不想将随机数保存为 int,您可以将其作为一行代码执行:
'{:03}'.format(random.randrange(1, 10**3))
python 3.6+ 仅限一行:
f'{random.randrange(1, 10**3):03}'
上述输出的示例为:
‘026’
‘255’
‘512’
实现为可以支持任意长度的数字(不仅仅是 3)的函数:
import random
def n_len_rand(len_, floor=1):
top = 10**len_
if floor > top:
raise ValueError(f"Floor '{floor}' must be less than requested top '{top}'")
return f'{random.randrange(floor, top):0{len_}}'
解决方案 4:
你可以编写一个小函数来完成你想做的事情:
import random
def randomDigits(digits):
lower = 10**(digits-1)
upper = 10**digits - 1
return random.randint(lower, upper)
基本上,10**(digits-1)
为您提供最小的 {digit} 位数字,并10**digits - 1
为您提供最大的 {digit} 位数字(恰好是最小的 {digit+1} 位数字减 1!)。然后我们从该范围内随机取一个整数。
解决方案 5:
0 算作可能的第一位数字吗?如果算,那么你需要random.randint(0,10**n-1)
。如果不是,那么你需要random.randint(10**(n-1),10**n-1)
。如果永远不允许零,那么你必须明确拒绝其中有零的数字,或者抽取n
random.randint(1,9)
数字。
另外:有趣的是,它randint(a,b)
使用了一些非 Python 式的“索引”来获取随机数a <= n <= b
。有人可能期望它像那样工作range
,并产生一个随机数a <= n < b
。(注意封闭的上间隔。)
鉴于对的评论中的回应randrange
,请注意这些可以用清洁剂和来代替random.randrange(0,10**n)
。random.randrange(10**(n-1),10**n)
`random.randrange(1,10)`
解决方案 6:
该解决方案不包括 0 作为起始整数。
import random
fixed_digits = 6
print(random.randrange(111111, 999999, fixed_digits))
out:
271533
如果 0 作为起始整数对您来说并不重要,那么您可以使用 000001 或 100000 作为起始范围。
解决方案 7:
我认为最好的选择是使用这个
from string import digits
import random
verify_code = ''.join(random.choice(digits) for i in range(6))
解决方案 8:
您可以创建一个函数,该函数使用一个 int 列表,将其转换为字符串以进行连接,然后再次强制转换 int,如下所示:
import random
def generate_random_number(length):
return int(''.join([str(random.randint(0,10)) for _ in range(length)]))
解决方案 9:
我真的很喜欢 RichieHindle 的回答,不过我也喜欢把这个问题当作练习。下面是使用字符串的强力实现:)
import random
first = random.randint(1,9)
first = str(first)
n = 5
nrs = [str(random.randrange(10)) for i in range(n-1)]
for i in range(len(nrs)) :
first += str(nrs[i])
print str(first)
解决方案 10:
从官方文档来看,sample() 方法似乎不适合此目的?
import random
def random_digits(n):
num = range(0, 10)
lst = random.sample(num, n)
print str(lst).strip('[]')
输出:
>>>random_digits(5)
2, 5, 1, 0, 4
解决方案 11:
我知道这是一个老问题,但多年来我看到过很多解决方案。这是我对创建一个默认为 6 的 n 位数字随机字符串的函数的建议。
from random import randint
def OTP(n=6):
n = 1 if n< 1 else n
return randint(int("1"*n), int("9"*n))
当然,您可以将“1”*n 更改为您想要的开始值。
扫码咨询,免费领取项目管理大礼包!