Если у меня есть функция с именем rand1(), которая генерирует число 0 (вероятность 30%) или 1 (вероятность 70%), то как написать функцию rand2(), которая генерирует 0 + 1 равновероятность использования rand1()?
Update:
Наконец, я обнаружил, что это проблема в книге "Введение в алгоритмы" (2-й) (я купил китайское издание этой книги), "Упражнение 5.1-3", оригинальная проблема:
5.1-3 Предположим, что вы хотите вывести 0 с вероятностью 1/2 и 1 с вероятностью 1/2. В вашем распоряжении - процедура BIASED-RANDOM, которая выводит либо 0, либо 1. Это выходы 1 с некоторой вероятностью p и 0 с вероятностью 1- p, где 0 < p < 1, но вы не знаете, что такое p. Дайте алгоритм, который использует BIASED-RANDOM как подпрограмма, и возвращает непредвзятый ответ, возвращая 0 с вероятностью 1/2 и 1 с вероятностью 1/2. Какое ожидаемое время работы вашего алгоритма как функция p?
решение: (см.: http://www.cnblogs.com/meteorgan/archive/2012/05/04/2482317.html)
Чтобы получить непредвзятый случайный бит, учитывая только вызовы BIASED-RANDOM, вызовите BIASED-RANDOM дважды. Неоднократно делайте это до тех пор, пока два вызова не возвратятся значения, и когда это произойдет, верните Þrst из двух бит:
UNBIASED-RANDOM
while TRUE
do
x ← BIASED-RANDOM
y ← BIASED-RANDOM
if x != y
then return x
Чтобы увидеть, что UNBIASED-RANDOM возвращает 0 и 1 каждый с вероятностью 1/2, наблюдайте что вероятность того, что заданная итерация вернет 0, равна
Pr {x = 0 and y = 1} = (1 − p)p ,
и вероятность того, что данная итерация вернет 1, равна
Pr {x = 1 and y = 0} = p(1 − p) .
(Мы полагаемся на биты, возвращаемые BIASED-RANDOM, независимыми.) Таким образом, вероятность того, что заданная итерация вернет 0, равна вероятности того, что она вернет 1. Поскольку для UNBIASED-RANDOM нет другого способа вернуть значение, он возвращает 0 и 1 с вероятностью 1/2.