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

时间:2010-04-20 07:38:19

标签: python random

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

>>> random(3)
563

or

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

9 个答案:

答案 0 :(得分:144)

获取随机的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

答案 1 :(得分:22)

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

n = 10
''.join(["%s" % randint(0, 9) for num in range(0, n)])

答案 2 :(得分: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)

答案 3 :(得分:3)

你可以写一点功能来做你想做的事情:

import random
def randomDigits(digits):
    lower = 10**(digits-1)
    upper = 10**digits - 1
    return random.randint(lower, upper)

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

答案 4 :(得分: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,则可以将其作为oneliner:

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

python 3.6+ only oneliner:

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

上述示例输出为:

  • &#39; 026&#39;
  • &#39; 255&#39;
  • &#39; 512&#39;

作为一个功能实现:

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 :(得分:2)

如果你不想记住所有看似随机的命令(比如我自己),你可以随时使用:

import random
Numbers = range(1, 10)
RandomNumber = random.choice(Numbers)
print(RandomNumber)
#returns a number

答案 6 :(得分: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)

答案 7 :(得分:0)

official documentation开始,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

答案 8 :(得分:0)

你可以创建一个使用int列表的函数,在string中进行转换以连接并再次转换为do int,如下所示:

import random

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