A Interviewstreet teve seu segundo CodeSprint em janeiro, que incluía a pergunta abaixo. A resposta programática é publicada, mas não inclui uma explicação estatística.
(Você pode ver o problema original e a solução publicada fazendo login no site do Interviewstreet com creds do Google e, em seguida, acessando o problema Coin Tosses nesta página .)
Lançamentos de moedas
Você tem uma moeda imparcial que deseja continuar jogando até obter N cabeças consecutivas. Você jogou a moeda M vezes e, surpreendentemente, todos os lançamentos resultaram em cara.
Qual é o número esperado de lançamentos adicionais necessários até que você obtenha N cabeças consecutivas?
Entrada:
A primeira linha contém o número de casos T. Cada uma das próximas linhas T contém dois números N e M.
Saída:
Linhas T de saída contendo a resposta para o caso de teste correspondente. Imprima a resposta arredondada para exatamente 2 casas decimais.
Entrada de amostra:
4
2 0
2 1
3 3
3 2
Saída de amostra:
6,00
4,00
0,00
8,00
Exemplos de explicações:
Se N = 2 e M = 0, você deve continuar jogando a moeda até obter 2 cabeças consecutivas. Não é difícil mostrar que, em média, são necessários 6 sorteios.
Se N = 2 e M = 1, você precisa de 2 cabeças consecutivas e já possui 1. Você precisa atirar mais uma vez, não importa o quê. Nesse primeiro sorteio, se você tiver cara, está feito. Caso contrário, você precisará recomeçar, pois o contador consecutivo é redefinido e continuar jogando a moeda até obter N = 2 cabeças consecutivas. O número esperado de lançamentos de moedas é, portanto, 1 + (0,5 * 0 + 0,5 * 6) = 4,0 Se N = 3 e M = 3, você já tem 3 cabeças, portanto, não precisa mais jogar.
Todas as equações matemáticas que criei tinham as respostas corretas para os dados de entrada de amostra listados acima, mas estavam erradas para todos os outros conjuntos de entradas (que não são conhecidos). A solução programática deles parece resolver o problema de maneira bem diferente do meu método de tentar criar uma equação. Alguém pode explicar como chegar a uma equação que resolveria isso?
fonte
Respostas:
Este é um exercício computacional, então pense recursivamente . O estado atual do lançamento da moeda é determinado pelo par ordenado com N ≥ M ≥ 0 . Seja o número esperado de lançamentos para alcançar N cabeças consecutivas e e ( N , M ) :(N,M) N≥M≥0 N e(N,M)
(1) Há 50% de chance do próximo lançamento ser cara, levando você para o estado , e 50% de chance do próximo lançamento ser coroa, levando você para o estado ( N , 0 ) . Isso custa um flip. Portanto, a expectativa (recursivamente) é dada por(N,M+1) (N,0)
(2) Condições básicas: você já estipulou que
e obviamente
(não são necessários mais movimentos).
Aqui está o programa Mathematica correspondente (incluindo armazenamento em cache de resultados intermediários para acelerar a recursão, o que efetivamente o torna uma solução de programação dinâmica):
O programa seria semelhante em outras linguagens de programação que suportam recursão. Matematicamente, podemos verificar que simplesmente verificando a recursão, porque obviamente vale para os casos base:e(N,M)=2N+1−2M+1
o que é verdade para qualquer e N , QED.M N
De maneira mais geral , a mesma abordagem estabelecerá que quando a moeda tem probabilidadepde cabeças. A parte mais difícil é calcular a condição de basee(N,0). Isso é feito perseguindo a recursão deNetapas até que finalmentee(N,0)seja expresso em termos de si mesmo e resolvendo:e(N,M)=p−N−p−M1−p p e(N,0) N e(N,0)
fonte
find_x(n)
if n=0 return 1 else return 2*find_x(n-1)
find_x
y = 1; while n > 0 do begin y=2*y; n=n-1 end; return y
R
), eles dificilmente diferem. (Em um caso, você cria e processa um vetor1:n
e, no outro, descobre quen:1
foi colocado na pilha e processado ao contrário.) Mas parte do meu ponto era conceitual : seu comentário inicial falou em "trabalhar iterativamente". Isso se referia à análise e não a qualquer programa de computador. Mas esses são pontos tangenciais e triviais, cuja discussão não justifica estender esse tópico de comentários.Para resolver esse problema, usarei processos estocásticos, tempos de parada e programação dinâmica.
Primeiro, algumas definições:
O primeiro corresponde ao número esperado de lançamentos antes de obter uma cauda, assumindo que uma cauda seja lançada antes de N cabeças consecutivas serem observadas, assumindo que começamos com M cabeças consecutivas. Não é muito difícil ver que
Agora, tudo o que precisamos fazer é calcular a segunda expectativa condicional que corresponde ao número esperado de lançamentos necessários para observar N cabeças consecutivas a partir de 0. Com cálculos semelhantes, vemos que
Isso fornece uma resposta final de:
Isso concorda com os quatro casos de teste que você listou. Com uma resposta tão simples, pode haver uma maneira mais fácil de calcular isso.
fonte
Aviso: o seguinte pode não ser considerado uma resposta adequada, pois não fornece uma solução de formulário fechado para a pergunta, esp. quando comparado com as respostas anteriores . No entanto, achei a abordagem suficientemente interessante para descobrir a distribuição condicional.
Considere a questão preliminar de obter uma sequência de cabeças de lances, com probabilidade . Isso é dado pela fórmula de recorrência De fato, meu raciocínio é que nenhum cabeçalho consecutivo de draws pode ser decomposto de acordo com a primeira ocorrência de uma cauda do primeiro joga. O condicionamento de saber se essa primeira cauda ocorre no primeiro, segundo, ..., ° empate leva a essa relação de recorrência.N k 1−p(N,k)
Em seguida, a probabilidade de obter as primeiras N cabeças consecutivas em lançamentos de é $$ q (N, m) = \ begin {cases} \ dfrac {1} {2 ^ N} & \ text {if} m = N \m≥N
$$ O primeiro caso é auto-explicativo. o segundo caso corresponde a uma cauda ocorrendo no empate, seguida por cabeças, e o último caso proíbe cabeças consecutivas antes do empate. (Os dois últimos casos podem ser condensados em um, garantido!)m−N−1 N N m−N−1
Agora, a probabilidade de obter cabeças primeiro e as primeiras cabeças consecutivas em exatamente lançamentos (e não menos) é $$ r (M, N, m) = \ begin {cases} 1/2 ^ N & \ text {if} m = N \M N m≥N
\ end {cases} s (M, N, m) = \ begin {cases} 1 / {2 ^ {NM}} & \ text {if} m = N \ 0 & \ text {if} N \ sum_ {r = M + 1} ^ {N} \ dfrac {q (N, sr)} {2 ^ {rM }} & \ text {if} N + M
\ end {cases} \ mathfrak {E} (M, N) = \ sum_ {m = N} ^ \ infty m \, s (M, N, m) $$ ou para o número de etapas adicionais ...E ( M , N ) - M
fonte