É fácil gerar uma moeda justa usando uma moeda injusta, mas o inverso é mais difícil de realizar.
Seu programa receberá um número X (entre 0 e 1, inclusive) como entrada. A entrada não deve simplesmente ser codificada como um número no meio do código-fonte. Ele deve retornar um único dígito: a 1
com uma probabilidade de X e um 0
caso contrário.
Seu programa só pode usar uma forma de gerador de números aleatórios no código-fonte: int(rand(2))
(ou equivalente), que retorna zero ou um com probabilidade igual. Você pode incluir ou acessar esta função quantas vezes desejar no seu código. Você também deve fornecer a função como parte do código.
Seu programa não tem permissão para usar outras funções geradoras de número aleatório ou fontes externas (como funções de data e hora) que possam funcionar como uma função geradora de número aleatório. Ele também não pode acessar nenhum arquivo externo ou passar o trabalho para programas externos.
Este é o código de golfe, a resposta mais curta ganha.
Respostas:
Perl, 37
42charAssume probabilidade arbitrária como argumento de linha de comando. Cria um número aleatório uniforme
$d
e o compara com a entrada.Solução anterior de 52 caracteres
fonte
Python, 81 caracteres
Pode demorar um pouco, mas nunca mais que 1%.
fonte
random.random() < desiredProbability
uso deste script: gist.github.com/3656877 Eles correspondem perfeitamente i.imgur.com/Hr8uE.pngrandom.random() < x
seja consideravelmente mais rápido.Mathematica 165
Não é simplificado, mas alguns podem encontrar o algoritmo de interesse:
Uso
Verifica
Vamos ver se
f[.53]
realmente produz o valor em1
torno de 53% do tempo. Cada teste calcula a% para amostras de 10 ^ 4.50 desses testes são executados e calculados a média.
Histograma de resultados
Explicação (alerta de spoiler!)
A representação da base 2 de 0,53 é
Prosseguindo da esquerda para a direita, um dígito de cada vez:
Se RandomInteger [] retornar 1, então answer = 1,
Senão Se o segundo RandomInteger [] retornar 0, então responda = 0,
Senão Se o terceiro RandomInteger [] retornar 0, a resposta = 0,
Outro....
Se, quando todos os dígitos tiverem sido testados, ainda não houver resposta, answer = RandomInteger [].
fonte
Haskell, 107 caracteres:
fonte
Wolfram Language (Mathematica) , 42 bytes
Experimente online!
Essa é uma abordagem recursiva. Sem algoritmo, o algoritmo é:
p
for menor que 1/2, quando o lançamento da moeda subir 0, retorne 0. Caso contrário, prossiga2p
; assumindo a correção, a probabilidade geral de obter 1 é metade de2p
oup
.p
for maior que 1/2, quando o lançamento da moeda aparecer 1, retorne 1. Caso contrário, continue2p-1
; assumindo a correção, a probabilidade geral de obter 0 é metade de1-(2p-1)
ou1-p
.Para encurtar, começamos com o sorteio aleatório de moedas, que, em qualquer ramo, é retornado metade do tempo. Se o coinflip não corresponder ao caso em que devemos devolvê-lo, substitua-o pelo resultado da recorrência no
2p
módulo 1. (Ou seja, quandop
for menor que 1/2, substitua 1; quandop
for maior que 1/2 , substitua 0. Isso equivale a substituir⌈1-2p⌉
.)fonte