Как создать случайное число с определенной длиной в python



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



>>> random(3)
563

or

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

9 ответов:

чтобы получить случайное 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(["%s" % randint(0, 9) for num in range(0, n)])

0 считается возможной первой цифрой? Если это так, то вам нужно random.randint(0,10**n-1). Если нет, то random.randint(10**(n-1),10**n-1). А если ноль-это никогда разрешено, тогда вам придется явно отклонять числа с нулем в них или рисовать nrandom.randint(1,9) цифры.

в сторону: интересно, что randint(a,b) использует несколько non-обновления "индексация", чтобы получить случайное число 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) дает вам наименьшее {цифра} - число цифр, и 10**digits - 1 дает вам самый большой {цифра} - номер цифры (который, оказывается, самый маленький {цифра+1}-номер цифры минус 1!). Тогда мы просто берем случайное число из этого диапазона.

Если вы не хотите запоминать все различные, казалось бы, случайные команды (как я), вы всегда можете использовать:

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

Если вам нужен 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+ только одна строка:

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

пример выходных данных выше являются:

  • '026'
  • '255'
  • '512'

Мне очень понравился ответ 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, преобразуется в строку для объединения и приведения do int снова, что-то вроде этого:

import random

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

Comments

    Ничего не найдено.