Supongamos que tengo un dado cargado de n lados donde cada lado k tiene alguna probabilidad p k de aparecer cuando lo saco. Tengo curiosidad por saber si hay un buen algoritmo para almacenar esta información estáticamente (es decir, para un conjunto fijo de probabilidades) para poder simular de manera eficiente una tirada aleatoria del dado.
Actualmente, tengo una solución O (lg n) para este problema. La idea es almacenar una tabla de la probabilidad acumulativa de los primeros k lados para todos los k, generar un número real aleatorio en el rango [0, 1) y realizar una búsqueda binaria sobre la tabla para obtener el índice más grande cuyo acumulado el valor no es mayor que el valor elegido. Prefiero esta solución, pero parece extraño que el tiempo de ejecución no tenga en cuenta las probabilidades. En particular, en los casos extremos de un lado que siempre aparece o que los valores se distribuyen uniformemente, es posible generar el resultado del rollo en O (1) usando un enfoque ingenuo, aunque mi solución aún tomará muchos pasos logarítmica.
¿Alguien tiene alguna sugerencia sobre cómo resolver este problema de una manera que sea de alguna manera "adaptativa" en su tiempo de ejecución?
EDITAR : Basado en las respuestas a esta pregunta, he escrito un artículo que describe muchos enfoques a este problema , junto con sus análisis. Parece que la implementación de Vose del método de alias da time (n) tiempo de preprocesamiento y O (1) tiempo por tirada, lo cual es realmente impresionante. ¡Ojalá sea una adición útil a la información contenida en las respuestas!