Як генерувати випадкове число з певною довжиною в пітоні


105

Скажімо, мені потрібно тризначне число, тож це було б щось на зразок:

>>> random(3)
563

or

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

Відповіді:


182

Щоб отримати випадкове 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

7
За допомогою цього рішення ви вилучите 10 випадкових чисел зі свого випадкового пулу
Nicu Surdu,

5
@NicolaeSurdu: Так, тому я сказав, припускаючи, що ти справді маєш на увазі три цифри, а не "до трьох цифр".
RichieHindle

3
037 це 3-значний номер, менший ніж 100 :). Це я мав на увазі. Але так, для нелотерейних заявок ваше рішення просто чудове;)
Nicu Surdu

@NicolaeSurdu Як цей сніпет може дати результат 037 ??? це рандомінг від (100 до 1000), якщо n == 3
молдовський

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 були дійсними номерами, вам все одно слід використовувати ранжир / 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}'

Приклади результатів вищезазначеного:

  • '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).


@Andrew: a <= n <= bмене теж здивувало. Я обурююся тим, що потрібно додатково вносити -1в свій код. :-)
RichieHindle

1
@Andrew - досить дивно, що код Python randint(він знаходиться в Lib / random.py) насправді просто дзвінки randrange(a, b+1)!
Даніель Г

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

Чи не виходить із офіційної документації , що метод 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

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.