Как реализовать рандом в определенном диапазоне с "выколотым" числом, которое было в прошлой переменной с рандомом?
from random import randint
a1 = randint(1,100)
a2 = randint(1,100)
print(a1)
print(a2)
например, в a1 будет 88
тогда как в a2 получить значение от 1 до 100, не включая число 88
при этом используя только линейные алгоритмы
Ответы (3 шт):
если числа целые и их не очень много, то
res = random.choice(i for i in range(a, b + 1) if i != last)
т.е. формируем список значений в которые не включено ранее выбранное число last и выбираем случайно значение из сформированного списка
если же числа целые и их много, то практически без изменения распределения можно сделать так:
res = last while res == last: res = random.randomint(a, b)
т.е. выбираем в непроколотом отрезке и если все таки попали на ранее выбранное значение, то выбираем еще раз
тут конечно немного меняется распределение, но из-а большого кол-ва значений очень несущественно, иначе см. способ 1)
- если числа с плавающей запятой, то там вообще бессмысленно какие-то проколы учитывать - там в идеале все бесконечномалом должно быть
P.S.
для целых чисел есть еще один способ, который не изменит распределения совсем (наверное это идеальный способ)
value = random.randint(a, b - 1)
if value >= last:
value += 1
if value == b + 1:
value = a
т.е. выбираем число из диапазона [a, b) и если оно не меньше last просто сдвигаем на 1 вправо, т.е. как бы создаём прокол
надо только учесть если было выколото числа last == b - это случай можно обработать по разному - или в начале или в конце (как я)
Не уверен, что это то, что нужно, но как вариант:
from random import shuffle
l = list(range(1, 100))
shuffle(l)
print(l.pop(), l.pop())
Или без перемешивания:
from random import randint
l = list(range(1, 100))
print(l.pop(randint(1, len(l) - 1)))
print(l.pop(randint(1, len(l) - 1)))
Можно ещё через множества, хотя это в неявном виде всё-равно те же циклы. Но совсем в неявном.
from random import randint,choice
numbers = set(range(1,100))
a1 = choice(list(numbers))
numbers.remove(a1)
a2 = choice(list(numbers))
numbers.remove(a2)
a3 = choice(list(numbers))
# ...
print(a1)
print(a2)
print(a3)
# ...
И так можно и дальше продолжать.