Как реализовать рандом в определенном диапазоне с "выколотым" числом, которое было в прошлой переменной с рандомом?

from random import randint
a1 = randint(1,100)
a2 = randint(1,100)
print(a1)
print(a2)

например, в a1 будет 88

тогда как в a2 получить значение от 1 до 100, не включая число 88

при этом используя только линейные алгоритмы


Ответы (3 шт):

Автор решения: Zhihar
  1. если числа целые и их не очень много, то

     res = random.choice(i for i in range(a, b + 1) if i != last)
    

т.е. формируем список значений в которые не включено ранее выбранное число last и выбираем случайно значение из сформированного списка

  1. если же числа целые и их много, то практически без изменения распределения можно сделать так:

     res = last
    
     while res == last:
         res = random.randomint(a, b)
    

т.е. выбираем в непроколотом отрезке и если все таки попали на ранее выбранное значение, то выбираем еще раз

тут конечно немного меняется распределение, но из-а большого кол-ва значений очень несущественно, иначе см. способ 1)

  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 - это случай можно обработать по разному - или в начале или в конце (как я)

→ Ссылка
Автор решения: mkkik

Не уверен, что это то, что нужно, но как вариант:

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)))
→ Ссылка
Автор решения: CrazyElf

Можно ещё через множества, хотя это в неявном виде всё-равно те же циклы. Но совсем в неявном.

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)
# ...

И так можно и дальше продолжать.

→ Ссылка