Получение равномерного распределения вероятностей с ограниченными средствами

Допустим, у вас есть монета, и вы хотите случайным образом выбрать одно из 3 (или более) чисел с равной вероятностью. Если вы просто подбрасываете монету для каждой пары, то вы даете выжившему в первом раунде два шанса проиграть, а распределение неравномерно.

В общем случае у вас есть функция Random(0,1), которая возвращает 0 с вероятностью 0,5 и 1 с вероятностью 0,5. Используя эту функцию, создайте Random(a,b), которая возвращает любое целое число в диапазоне [a,b] с равной вероятностью.

Любые идеи?


person ballaw    schedule 13.10.2013    source источник


Ответы (1)


Легче сгенерировать Random(0,3) с учетом Random(0,1). Random(0, 3) можно смоделировать двумя последовательными подбрасываниями монеты, чтобы получить четыре корзины: 00, 01, 10, 11.

В общем, Random (0, 2 ^ n-1) тривиально легко сгенерировать при заданном Random (0, 1) [т.е. честная монета]. Любой другой Random(0, n) будет сложно сгенерировать, и он не будет по-настоящему «случайным», потому что вам придется заранее определить количество результатов, которые вы хотите рассматривать как принадлежащие «другим» корзинам.

Вы можете почти подделать Random(0,2) вот так (псевдокод, подобный Ruby):

options = ['h', 't', 'n']       # heads, tails, neither
hash = {'h' => 0, 't' => 0, 'n' => 0}    # number of 'heads', 'tails', 'neither'
rand = options[random(0, 1)]
rand = 'n' if (hash[rand] % 3 == 2) # every third 'h' or 't' is an 'n'
hash[rand] ++ # update buckets

Опять же, это не «случайно», поскольку каждый третий орёл или решка считается «ни тем, ни другим».

ОБНОВЛЕНИЕ: см. соответствующий вопрос для более элегантного ответа. Создание генератора случайных чисел из подбрасывания монеты

person Saleem    schedule 13.10.2013