Відповіді:
Щоб отримати випадкове 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)])
Якщо вам потрібен трицифровий номер і хочете, щоб 001-099 були дійсними номерами, вам все одно слід використовувати ранжир / 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+ лише oneliner:
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)]))