Функция random и деление
Как сделать, чтобы функция рандом выводила случайные числа, при делении которых получалось бы число без остатка? Например:
from random import randint
x=randint(100, 999)
y=randint(2, 9)
z=x//y
Переменная z должна быть целым числом, получается, переменная y должна зависеть от переменной x, чтобы число получилось целым.
Ответы (3 шт):
Чтобы делилось без остатка, можно развернуть проблему - генерировать случайные сомножители z и y, и получать их произведение x=z*y, отбрасывая пары, дающие результаты вне нужного диапазона.
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(), которая выбирает случайный элемент из списка.
- не функцию
Если требования к распределению строгие (равномерное распределение) и общее количество пар не велико (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