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


105

假设我需要一个3位数的数字,因此它类似于:

>>> random(3)
563

or

>>> random(5)
26748
>> random(2)
56

Answers:


182

要获得一个随机的3位数字:

from random import randint
randint(100, 999)  # randint is inclusive at both ends

(假设您实际上是指三位数,而不是“最多三位数”。)

要使用任意数量的数字:

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

7
使用此解决方案,您将从随机池中消除10 **(n-1)个数字
Nicu Surdu,2012年

5
@NicolaeSurdu:是的,这就是为什么我说假设您的意思是三位数,而不是“最多三位数”。
RichieHindle 2012年

3
037是3位数字,小于100 :)。我正是这个意思。但是,是的,对于非彩票应用,您的解决方案很好;)
Nicu Surdu 2012年

@NicolaeSurdu这个片段如何给您037的结果???如果n == 3,则是从(100到1000)的
randint

3
@moldovean从顶部阅读:)。我的意思是我想要那个数字,而此解决方案将不会给您提供不超过该位数的数字,而是精确地给您该位数。这很糟糕,我错过了括号中的子句。
Nicu Surdu 2014年

41

如果要将其作为字符串(例如10位电话号码),可以使用以下命令:

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

''.join(str(randint(0,9))for _ in range(n))
Mike Fogel

13

如果您需要一个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,则可以将其作为oneliner进行:

'{:03}'.format(random.randrange(1, 10**3))

python 3.6+只有oneliner:

f'{random.randrange(1, 10**3):03}'

上面的示例输出是:

  • '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_}}'

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)


@安德鲁:a <= n <= b我也很惊讶。我讨厌必须-1在我的代码中添加额外的内容。:-)
RichieHindle

1
@Andrew-有趣的是,randint(位于Lib / random.py中)的Python代码实际上只是在调用randrange(a, b+1)
丹尼尔·G

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!)。然后,我们只是从该范围取一个随机整数。


0

我真的很喜欢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)

0

官方文档来看,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

0

您可以创建一个使用int列表,将字符串转换为连接并再次转换为int的函数,如下所示:

import random

def generate_random_number(length):
    return int(''.join([str(random.randint(0,10)) for _ in range(length)]))

它不会生成特定长度的数字:(
Prometheus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.