Получение рандомов с вероятностью одна треть

52
6

Имея 1-битный случайный генератор (который дает один или ноль), создайте функцию, которая вернет 0, 1 или 2 с вероятностью EQUAL.

спросил(а) 2015-02-17T21:33:00+03:00 5 лет, 1 месяц назад
1
Решение
72

Поскольку OP уже выведен в комментарии, решение состоит в том, чтобы сгенерировать два случайных бита и сделать следующее:

    если мы получим 00, вернем 0 (вероятность 25%), если мы получим 01, вернемся 1 (25% шанс) если мы получим 10, вернем 2 (шанс 25%), если мы получим 11, снова сгенерируем два случайных бита (вероятность 25%),

Теперь есть две проблемы, о которых стоит подумать.

Что делать, если программа работает вечно?

Это возможно в теории, но на практике этого не произойдет. Нам понадобится генерировать последовательность 11, 11, 11, 11 ,... навсегда.

Так как получение 11 имеет только 25% -ный шанс, получение двух 11 подряд будет иметь 6,25% случаев, потому что 0.25*0.25 = 0.0625. Каждый последующий 11 добавляет другой коэффициент умножения 0.25 к вероятности. Создание десяти 11 до получения реального ответа имеет вероятность около 1e-6 (один в миллион), и эта функция работает так быстро, что это не проблема, даже если это произойдет.

Регенерирует ли эти два бита вероятность 1/3, которую мы хотим?

Ответ - нет. Генерирование двух наборов случайных битов можно считать независимыми процессами. Это означает, что знание ответа на первые два бита ничего не говорит о ответе на следующие два бита.

Когда мы снова решаем начать процедуру генерации, это, как если бы мы никогда не делали этого в первую очередь, поскольку последний полученный результат не зависит от следующего.

(На самом деле это неверно, поскольку генераторы случайных чисел детерминированы под капотом, но хороший однородный RNG будет иметь это свойство независимости при повторном тестировании).

ответил(а) 2015-02-17T22:40:00+03:00 5 лет, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема