Скажем, мне нужно 3-значное число, поэтому это будет что-то вроде:
>>> random(3)
563
or
>>> random(5)
26748
>> random(2)
56
Скажем, мне нужно 3-значное число, поэтому это будет что-то вроде:
>>> random(3)
563
or
>>> random(5)
26748
>> random(2)
56
Чтобы получить случайное 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
Если вы хотите использовать его в виде строки (например, 10-значный номер телефона), вы можете использовать это:
n = 10
''.join(["{}".format(randint(0, 9)) for num in range(0, n)])
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)
.
Если вам нужен трехзначный номер и вы хотите, чтобы 001-099 были действительными числами, вам все равно следует использовать randrange/randint, так как это быстрее, чем альтернативы. Просто добавьте необходимые предшествующие нули при преобразовании в строку.
import random
num = random.randrange(1, 10**3)
# using format
num_with_zeros = '{:03}'.format(num)
# using string zfill
num_with_zeros = str(num).zfill(3)
В качестве альтернативы, если вы не хотите сохранять случайное число как целое число, вы можете просто сделать это как одиночный:
'{: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_}}'
Вы можете написать себе небольшую функцию, чтобы делать то, что вы хотите:
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 + 1} -digit минус 1!). Тогда мы просто возьмем случайное целое из этого диапазона.
Если вы не хотите запоминать все разные, казалось бы, случайные команды (например, я), вы всегда можете использовать:
import random
Numbers = range(1, 10)
RandomNumber = random.choice(Numbers)
print(RandomNumber)
#returns a number
Мне очень понравился ответ 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, преобразует строку в конкатенацию и делает make int снова, примерно так:
import random
def generate_random_number(length):
return int(''.join([str(random.randint(0,10)) for _ in range(length)]))