Как сгенерировать случайное число определенной длины в Python


105

Скажем, мне нужно трехзначное число, это будет примерно так:

>>> random(3)
563

or

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

Ответы:


186

Чтобы получить случайное трехзначное число:

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) чисел из своего случайного пула
Нику Сурду

5
@NicolaeSurdu: Да, именно поэтому я сказал, предполагая, что вы действительно имели в виду три цифры, а не «до трех цифр».
RichieHindle 03

3
037 это трехзначное число меньше 100 :). Это то, что я имел в виду. Но да, для не лотерейного приложения ваше решение просто отлично;)
Нику Сурду,

@NicolaeSurdu Как этот снайпер может дать вам результат 037 ??? это рандинт от (100 до 1000), если n == 3
moldovean

3
@moldovean Читайте сверху :). Я имел в виду, что мне нужен этот номер, и это решение не выдаст вам числа до этого количества цифр, а скорее точно с этим количеством цифр. Это было у меня плохо, пропустил пункт в скобках.
Нику Сурду

41

Если вам нужна строка (например, 10-значный номер телефона), вы можете использовать это:

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

'' .join (str (randint (0, 9)) for _ in range (n))
Майк Фогель

13

Если вам нужно трехзначное число и вы хотите, чтобы 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}'

Примеры результатов вышеуказанного:

  • '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)для получения случайного числа используется несколько непифоническая «индексация» 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 - как ни странно, код Python для randint(он находится в Lib / random.py) на самом деле просто вызывает randrange(a, b+1)!
Daniel G

4

Вы можете написать себе небольшую функцию, чтобы делать то, что вы хотите:

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!). Затем мы просто берем случайное целое число из этого диапазона.


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

Вы можете создать функцию, которая использует список int, преобразует строку для конкатенации и снова приводит к int, примерно так:

import random

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

это не генерирует числа определенной длины :(
Прометей
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.