Suponha que eu tenha um dado carregado em frente e verso, em que cada lado k tenha alguma probabilidade pk de aparecer quando eu o enrolar. Estou curioso para saber se existe um bom algoritmo para armazenar essas informações estaticamente (ou seja, para um conjunto fixo de probabilidades), para que eu possa simular com eficiência um teste aleatório do dado.
Atualmente, tenho uma solução O (lg n) para esse problema. A idéia é armazenar uma tabela da probabilidade cumulativa dos primeiros k lados para todos os k, para gerar um número real aleatório no intervalo [0, 1) e realizar uma pesquisa binária sobre a tabela para obter o maior índice acumulado O valor não é maior que o valor escolhido. Eu gosto bastante dessa solução, mas parece estranho que o tempo de execução não leve em conta as probabilidades. Em particular, nos casos extremos de um lado sempre aparecendo ou com os valores distribuídos uniformemente, é possível gerar o resultado do rolo em O (1) usando uma abordagem ingênua, embora minha solução ainda tome muitas etapas logarítmicas.
Alguém tem alguma sugestão de como resolver esse problema de uma forma que seja "adaptável" em seu tempo de execução?
EDIT : Com base nas respostas a esta pergunta, escrevi um artigo descrevendo muitas abordagens para esse problema , juntamente com suas análises. Parece que a implementação do método alias por Vose fornece Θ (n) tempo de pré-processamento e O (1) tempo por rolo de matriz, o que é realmente impressionante. Espero que este seja um complemento útil para as informações contidas nas respostas!