Легко сгенерировать честную монету, используя недобросовестную монету, но обратное сделать сложнее.
Ваша программа получит одно число X (от 0 до 1 включительно) в качестве входных данных. Ввод не должен быть просто жестко закодирован как число в середине исходного кода. Затем он должен вернуть одну цифру: a 1
с вероятностью X, а в 0
противном случае.
Ваша программа может использовать только одну форму генератора случайных чисел в исходном коде: int(rand(2))
(или эквивалент), который возвращает либо ноль, либо единицу с равной вероятностью. Вы можете включить или получить доступ к этой функции столько раз, сколько пожелаете в своем коде. Вы также должны предоставить функцию самостоятельно как часть кода.
Ваша программа не имеет права использовать какие-либо другие функции генерации случайных чисел или внешние источники (такие как функции времени и даты), которые могут функционировать в качестве функции генерации случайных чисел. Он также не может получить доступ к каким-либо внешним файлам или передать работу внешним программам.
Это код гольф, самый короткий ответ выигрывает.
Ответы:
Perl, 37
42charПринимает произвольную вероятность в качестве аргумента командной строки. Создает равномерное случайное число
$d
и сравнивает его с входными данными.Ранее решение с 52 символами
источник
Питон, 81 символ
Может быть немного, но не более 1%.
источник
random.random() < desiredProbability
помощью этого скрипта: gist.github.com/3656877 Они отлично совпадают i.imgur.com/Hr8uE.pngrandom.random() < x
значительно быстрее.Mathematica 165
Не упрощено, но некоторые могут найти интересующий алгоритм:
использование
Проверьте
Давайте посмотрим,
f[.53]
действительно ли выдает значение1
примерно в 53% случаев. Каждый тест рассчитывает% для образцов 10 ^ 4.50 таких тестов проводятся и усредняются.
Гистограмма результатов
Пояснение (оповещение спойлера!)
Базовое 2 представление .53 является
Исходя из слева направо, по одной цифре за раз:
Если RandomInteger [] возвращает 1, тогда answer = 1,
Иначе, если second RandomInteger [] возвращает 0, тогда answer = 0,
Иначе, если третий RandomInteger [] возвращает 0, ответ = 0,
Else ....
Если после проверки всех цифр ответа по-прежнему нет, то answer = RandomInteger [].
источник
Haskell, 107 символов:
источник
Wolfram Language (Mathematica) , 42 байта
Попробуйте онлайн!
Это рекурсивный подход. Без правил, алгоритм выглядит так:
p
меньше 1/2, то, когда коинфлип поднимется до 0, верните 0. В противном случае продолжите2p
; при условии правильности общая вероятность получения 1 равна половине2p
илиp
.p
больше 1/2, то, когда коинфлип поднимется до 1, верните 1. В противном случае продолжите2p-1
; при условии правильности общая вероятность получения 0 равна половине1-(2p-1)
или1-p
.Чтобы сделать его короче, мы начнем со случайного монетного клипа, который в любом случае возвращается половину времени. Если coinflip не соответствует случаю, когда мы должны его вернуть, замените его результатом повторения по
2p
модулю 1. (То есть, когдаp
меньше 1/2, замените 1; когдаp
больше 1/2 , заменить 0. Это эквивалентно замене⌈1-2p⌉
.)источник