+7 (495) 147-04-32
Главная
/
Блог
/
Генерация случайных чисел в заданном диапазоне: задача с собеседования

Генерация случайных чисел в заданном диапазоне: задача с собеседования

Семён Евёлкин
Семён Евёлкин
Backend разработчик
Генерация случайных чисел в заданном диапазоне: задача с собеседования

Придя на собеседование, вы должны быть готовы к тому, что могут спросить что угодно, связанное с бекенд-стеком.

Например: что такое генераторы? Кандидат должен понимать, что такое генераторы и как они работают в Python, что они используют yield вместо return, и что они позволяют генерировать последовательность значений по запросу.

Но теория — это лишь вершина айсберга, вас могут попросить реализовать простейшую функцию-генератор. Одной их классических задач является реализация функции-генератора случайных числе в заданном диапазоне.

Задача:
 

Напишите функцию-генератор random_numbers(a, b, k), которая будет возвращать последовательность случайных чисел в заданном диапазоне и с заданной длиной.
 

a (int) — Нижняя граница диапазона случайных чисел (включительно)

b (int) — Верхняя граница диапазона случайных чисел (включительно)
 

k (int) — Количество случайных чисел, которые генератор должен вернуть за одну итерацию

# usage example

gen = random_numbers(a=5, b=10, k=3)

# first call next()
print(next(gen))  # output 3 random numbers from 5 to 10, for example: [7, 9, 5]

# second call next()
print(next(gen))  # output another 3 random numbers for example: [10, 6, 8]

# and so on

Требования:
 

1. Реализовать функцию-генератор random_numbers(a, b, k)

2. Использовать модуль random для генерации случайных чисел


3. Генератор должен возвращать список из k случайных чисел при каждом вызове next().


4. После исчерпания генератора (например, при бесконечном вызове next), он не должен вызывать ошибку StopIteration (на практике для собеседования это не критично, но если кандидат сам отметит бесконечность, то это будет плюсом)


Дополнительно: Можно ли сделать данный генератор бесконечным, чтобы он не выбрасывал исключение StopIteration?

Почему эта задача подходит для собеседования:

  • Проверяет знание генераторов: Кандидат должен уметь создавать и использовать генераторы.

  • Оценивает умение работать с модулями: Использование модуля random для генерации случайных чисел.

  • Демонстрирует понимание циклов и списков: Создание списка из k элементов.

  • Оценивает навыки проектирования: Кандидат должен уметь логически выстроить код для решения задачи.

  • Разговорная часть: Задача способствует обсуждению концепций генераторов и их применению.

Перейдем от слов к реализации:

import random

def random_numbers(*, a: int, b: int, k: int):
    while True:
        result = []
        for _ in range(k):
            result.append(random.randint(a, b))
        yield result


# Пример использования:
gen = random_numbers(a=5, b=10, k=3)

print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen))

Объяснение

import random: 

—  Импортируем модуль random для работы со случайными числами.

def random_numbers(*, a: int, b: int, k: int):

—  Определяем функцию-генератор random_numbers, которая принимает три аргумента согласно условию задачи.

while True:

—  Создаем бесконечный цикл, чтобы генератор не заканчивался. Это позволяет генерировать последовательности случайных чисел, пока это необходимо. Если это убрать, то генератор будет завершаться.

result = []:

—  На каждой итерации цикла создаем пустой список result, в который будем добавлять случайные числа.

for _ in range(k):

—  Запускаем цикл k раз для генерации k случайных чисел.

random.randint(a, b):

—  Функция random.randint() генерирует случайное целое число в диапазоне от a до b (включительно).

result.append(...):

—  Каждое сгенерированное случайное число добавляется в список result.

yield result:

—  Ключевое слово yield превращает функцию в генератор. yield result возвращает список result и приостанавливает выполнение генератора, сохраняя его состояние. При следующем вызове next() выполнение продолжится с места, где оно было приостановлено, и сгенерируется следующий список.

Данный генератор является бесконечным благодаря циклу while True

То есть, без него, функция-генератор будет выбрасывать исключение StopIteration

Поделиться

Обсудить проект с командой LighTech

Забронировать встречу

Примеры реализации проектов

Обсудить проект
Имя
Связаться
Сообщение
Прикрепить файл +
Запрос на получение файлов
Имя
Отправить файлы
Сообщение
Спасибо!
Ваша заявка отправлена
После обработки наш менеджер свяжется с вами