Скажем, мне нужно трехзначное число, это будет примерно так:
>>> random(3)
563
or
>>> random(5)
26748
>> random(2)
56
Ответы:
Чтобы получить случайное трехзначное число:
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
Если вам нужна строка (например, 10-значный номер телефона), вы можете использовать это:
n = 10
''.join(["{}".format(randint(0, 9)) for num in range(0, n)])
Если вам нужно трехзначное число и вы хотите, чтобы 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}'
Примеры результатов вышеуказанного:
Реализовано как функция:
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_}}'
Считается ли 0 возможной первой цифрой? Если да, то вам нужно random.randint(0,10**n-1)
. Если нет, то random.randint(10**(n-1),10**n-1)
. И если ноль никогда не допускается, вам придется явно отклонять числа с нулем в них или рисовать n
random.randint(1,9)
числа.
В сторону: интересно, что randint(a,b)
для получения случайного числа используется несколько непифоническая «индексация» 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
в свой код. :-)
randint
(он находится в Lib / random.py) на самом деле просто вызывает randrange(a, b+1)
!
Вы можете написать себе небольшую функцию, чтобы делать то, что вы хотите:
import random
def randomDigits(digits):
lower = 10**(digits-1)
upper = 10**digits - 1
return random.randint(lower, upper)
По сути, 10**(digits-1)
дает вам наименьшее {цифра} -значное число и 10**digits - 1
дает вам наибольшее {цифра} -значное число (которое оказывается наименьшим {цифра + 1} -значное число минус 1!). Затем мы просто берем случайное целое число из этого диапазона.
Мне очень понравился ответ 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, преобразует строку для конкатенации и снова приводит к int, примерно так:
import random
def generate_random_number(length):
return int(''.join([str(random.randint(0,10)) for _ in range(length)]))