如何生成一个具有特定数量的随机数?

假设我需要一个3位数的数字,它应该是这样的:

>>> random(3)
563


or


>>> random(5)
26748
>> random(2)
56
251546 次浏览

你可以使用 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

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)来替代。

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

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

基本上,10**(digits-1)给出了最小的{ data }-digital 数字,而 10**digits - 1给出了最大的{ digital }-digital 数字(这恰好是最小的{ digital + 1}-digital 数字减去1!).然后我们从这个范围取一个随机整数。

如果您希望它是一个字符串(例如,一个10位数的电话号码) ,您可以使用以下内容:

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

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

正式文件来看,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

你可以创建一个函数,它使用一个 int 列表,转换为 string 来连接,然后再次强制转换 do int,如下所示:

import random


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

如果你需要一个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)

或者,如果你不想把随机数保存为整型数,你也可以把它保存为一行:

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

Python 3.6 + only oneliner:

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_}}'
import random


fixed_digits = 6


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


out:
271533

我知道这是个古老的问题,但这些年来我看到了很多解决方案。下面是我对创建一个默认为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 改成你想要的开头。