Функция random и деление

Рейтинг: 2Ответов: 3Опубликовано: 14.06.2023

Как сделать, чтобы функция рандом выводила случайные числа, при делении которых получалось бы число без остатка? Например:

from random import randint
x=randint(100, 999)
y=randint(2, 9)
z=x//y

Переменная z должна быть целым числом, получается, переменная y должна зависеть от переменной x, чтобы число получилось целым.

Ответы

▲ 2Принят

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

import random


def random_pair(x_first, x_last, y_first, y_last):
    y_first = 2
    y_last = 9
    x_first = 100
    x_last = 999
    pairs = []
    for y in range(y_first, y_last + 1):
        # x_start = x_first округлённый вверх до числа кратного y
        x_start = y * ((x_first + y - 1) // y)
        for x in range(x_start, x_last + 1, y):
            pairs.append((x, y))
    return lambda: random.choice(pairs)


rp = random_pair(2, 9, 100, 999)
for _ in range(10):
    x, y = rp()
    print(f'{x}/{y}', end=' ')
print()
$ python random-pairs.py
852/4 561/3 324/9 837/9 768/2 507/3 999/3 621/3 114/3 138/2
▲ 6

Чтобы делилось без остатка, можно развернуть проблему - генерировать случайные сомножители z и y, и получать их произведение x=z*y, отбрасывая пары, дающие результаты вне нужного диапазона.

▲ 3
from random import randint, choice

x = randint(100, 999)
# y = randint(2, 9)         # заменим за следующие команды

divisors = [el for el in range(2, 9+1) if x % el == 0]
y = choice(divisors)

Объяснение:

После сгенерирования первого числа нам нужно сгенерировать второе, но не из полного диапазона целых чисел от 2 до 9, но только из тех, которые являются делителями первого сгенерированного числа.

Для этого сначала

  • создаем список divisors всех элементов el из диапазона от 2 до 9, которыми число x делится без остатка (т. е. с остатком 0):   x % el == 0,

  • затем применим

    • не функцию randint(), которая выбирает из полного диапазона, а
    • функцию choice(), которая выбирает случайный элемент из списка.