Python: Как сгенерировать 12-значное случайное число?
В Python, как сгенерировать 12-значное случайное число? Есть ли какая-либо функция, где мы можем указать диапазон, например random.range(12)
?
import random
random.randint()
Вывод должен содержать строку с 12 цифрами в диапазоне 0-9 (допустимые начальные нули).
Ответы
Ответ 1
Что не так с прямым подходом?
>>> import random
>>> random.randint(100000000000,999999999999)
544234865004L
И если вы хотите его с ведущими нулями, вам нужна строка.
>>> "%0.12d" % random.randint(0,999999999999)
'023432326286'
Edit:
Мое собственное решение этой проблемы было бы примерно таким:
import random
def rand_x_digit_num(x, leading_zeroes=True):
"""Return an X digit number, leading_zeroes returns a string, otherwise int"""
if not leading_zeroes:
# wrap with str() for uniform results
return random.randint(10**(x-1), 10**x-1)
else:
if x > 6000:
return ''.join([str(random.randint(0, 9)) for i in xrange(x)])
else:
return '{0:0{x}d}'.format(random.randint(0, 10**x-1), x=x)
Результаты тестирования:
>>> rand_x_digit_num(5)
'97225'
>>> rand_x_digit_num(5, False)
15470
>>> rand_x_digit_num(10)
'8273890244'
>>> rand_x_digit_num(10)
'0019234207'
>>> rand_x_digit_num(10, False)
9140630927L
Временные методы для скорости:
def timer(x):
s1 = datetime.now()
a = ''.join([str(random.randint(0, 9)) for i in xrange(x)])
e1 = datetime.now()
s2 = datetime.now()
b = str("%0." + str(x) + "d") % random.randint(0, 10**x-1)
e2 = datetime.now()
print "a took %s, b took %s" % (e1-s1, e2-s2)
Результаты теста скорости:
>>> timer(1000)
a took 0:00:00.002000, b took 0:00:00
>>> timer(10000)
a took 0:00:00.021000, b took 0:00:00.064000
>>> timer(100000)
a took 0:00:00.409000, b took 0:00:04.643000
>>> timer(6000)
a took 0:00:00.013000, b took 0:00:00.012000
>>> timer(2000)
a took 0:00:00.004000, b took 0:00:00.001000
Что он нам говорит:
Для любой цифры длиной около 6000 символов мой метод быстрее - иногда МНОГО быстрее, но для больших чисел метод, предложенный arshajii, выглядит лучше.
Ответ 2
Сделайте random.randrange(10**11, 10**12)
. Он работает как randint
соответствует range
Из документации:
randrange(self, start, stop=None, step=1, int=<type 'int'>, default=None, maxwidth=9007199254740992L) method of random.Random instance
Choose a random item from range(start, stop[, step]).
This fixes the problem with randint() which includes the
endpoint; in Python this is usually not what you want.
Do not supply the 'int', 'default', and 'maxwidth' arguments.
Это эффективно, как делать random.choice(range(10**11, 10**12))
или random.randint(10**1, 10**12-1)
. Поскольку он соответствует тому же синтаксису, что и range()
, он намного более интуитивно понятен и чище, чем эти две альтернативы
Если ведущие нули разрешены:
"%012d" %random.randrange(10**12)
Ответ 3
Существует много способов сделать это:
import random
rnumber1 = random.randint(10**11, 10**12-1) # randint includes endpoint
rnumber2 = random.randrange(10**11, 10**12) # randrange does not
# useful if you want to generate some random string from your choice of characters
digits = "123456789"
digits_with_zero = digits + "0"
rnumber3 = random.choice(digits) + ''.join(random.choice(digits_with_zero) for _ in range(11))
Ответ 4
Поскольку ведущие нули разрешены (по вашему комментарию), вы также можете использовать:
int(''.join(str(random.randint(0,9)) for _ in xrange(12)))
EDIT. Конечно, если вы хотите строку, вы можете просто оставить часть int
:
''.join(str(random.randint(0,9)) for _ in xrange(12))
Это кажется самым простым способом сделать это, на мой взгляд.
Ответ 5
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(12)
Ответ 6
Это может быть не совсем то, что вы ищете, но библиотека, подобная rstr, позволяет генерировать случайные строки. При этом все, что вам понадобится, (разрешено только 0):
import rstr
foo = rstr.digits(12)