Uniform random из rand2 через rejection sampling

MediumАлгоритмы
05:00
Лучше работает на десктопе
AlgorithmsProbabilityRejection SamplingRandomness
Реальный собес00:19:29-00:35:10Silver Mont HFT Dina.m4a

Есть источник случайных битов rand2, который равновероятно возвращает 0 или 1.

Нужно получить равномерное случайное число из диапазона [0, n - 1]. В тренажере вместо настоящей случайности передается готовый поток битов bits, чтобы решение можно было проверить детерминированно.

Используйте минимальное число битов chunk_size, такое что 2 ** chunk_size >= n. Читайте биты чанками, интерпретируйте чанк как binary integer. Если значение меньше n, верните его; иначе отбросьте чанк и читайте следующий.

Сигнатура

def uniform_from_rand2_bits(n: int, bits: list[int]) -> list[int]:

Верните [value, used_bits], где used_bits — сколько битов пришлось прочитать до принятого значения.

Примеры

Пример 1

Вход:
n = 3
bits = [0,0]
Выход:[0,2]

Пример 2

Вход:
n = 3
bits = [1,1,0,1]
Выход:[1,4]

Первый чанк 3 отбрасывается

Пример 3

Вход:
n = 5
bits = [1,0,1,0,0,1]
Выход:[1,6]

5 отбрасывается, 1 принимается

Консоль
Нажмите Run или Ctrl+Enter для запуска