如何在python中生成具有特定长度的随机数

Art*_*rty 89 python random

假设我需要一个3位数字,所以它会是这样的:

>>> random(3)
563

or

>>> random(5)
26748
>> random(2)
56
Run Code Online (Sandbox Code Playgroud)

Ric*_*dle 156

要获得随机的3位数字:

from random import randint
randint(100, 999)  # randint is inclusive at both ends
Run Code Online (Sandbox Code Playgroud)

(假设你真的是指三位数,而不是"最多三位数".)

要使用任意数量的数字:

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)
Run Code Online (Sandbox Code Playgroud)

输出:

33
124
5127
Run Code Online (Sandbox Code Playgroud)

  • 使用此解决方案,您将从随机池中删除10**(n-1)个数字 (6认同)
  • @NicolaeSurdu:是的,这就是为什么我说*假设你真的是指三位数,而不是"最多三位数".* (4认同)
  • @moldovean从顶部阅读:).我的意思是我想要那个数字,这个解决方案不会给你数字到那个数字,而是数字的数字.这是我的坏事,我错过了括号中的条款. (3认同)
  • 037这是一个3位数字,小于100 :).我正是这个意思.但是,对于非彩票申请,你的解决方案很好;) (2认同)
  • 也可能是 `"".join([str(randint(0, 9)) for i in range(n)])` 或类似的东西。 (2认同)

osm*_*man 26

如果您想将其作为字符串(例如,10位数的电话号码),您可以使用:

n = 10
''.join(["{}".format(randint(0, 9)) for num in range(0, n)])
Run Code Online (Sandbox Code Playgroud)

  • ''.join(str(randint(0, 9)) for _ in range(n)) (2认同)

Bri*_*ian 6

如果您需要一个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)
Run Code Online (Sandbox Code Playgroud)

另外,如果您不想将随机数另存为int,则可以将其作为oneliner进行:

'{:03}'.format(random.randrange(1, 10**3))
Run Code Online (Sandbox Code Playgroud)

python 3.6+只有oneliner:

f'{random.randrange(1, 10**3):03}'
Run Code Online (Sandbox Code Playgroud)

上面的示例输出是:

  • '026'
  • '255'
  • '512'

实现为功能:

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_}}'
Run Code Online (Sandbox Code Playgroud)


jee*_*u94 6

此解决方案不包含 0 作为起始整数。

import random

fixed_digits = 6 

print(random.randrange(111111, 999999, fixed_digits))

out:
271533
Run Code Online (Sandbox Code Playgroud)

如果 0 作为起始整数对您来说并不重要,那么您可以使用 000001 或 100000 作为起始范围。


And*_*ffe 5

0算作可能的第一个数字吗?如果是这样,那么你需要random.randint(0,10**n-1).如果没有,random.randint(10**(n-1),10**n-1).如果不允许零,那么你必须明确拒绝零中的n random.randint(1,9)数字,或者绘制数字.

旁白:有趣的是,randint(a,b)使用一些非pythonic"索引"来获得一个随机数a <= n <= b.人们可能已经预料到它会起作用range,并产生一个随机数a <= n < b.(注意关闭的上部间隔.)

鉴于评论中的回答randrange,请注意这些可以用清洁剂代替random.randrange(0,10**n),random.randrange(10**(n-1),10**n)并且random.randrange(1,10).


Dan*_*l G 5

你可以自己写一个小函数来做你想做的事:

import random
def randomDigits(digits):
    lower = 10**(digits-1)
    upper = 10**digits - 1
    return random.randint(lower, upper)
Run Code Online (Sandbox Code Playgroud)

基本上,10**(digits-1)为您提供最小的 {digit} 位数,并10**digits - 1为您提供最大的 {digit} 位数(恰好是最小的 {digit+1} 位数减 1!)。然后我们只从该范围中随机取一个整数。