Supongamos que tengo un dado cargado por n lados en el que cada lado k tiene cierta probabilidad de p k que aparece cuando lo enrollo. Tengo curiosidad por saber si hay un buen algoritmo para almacenar esta información de forma estática (es decir, para un conjunto fijo de probabilidades), de manera que pueda simular de forma eficiente una tirada aleatoria del dado.Estructura de datos para dados cargados?
Actualmente, tengo una solución O (lg n) para este problema. La idea es almacenar una tabla de la probabilidad acumulada 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 acumulativo el valor no es mayor que el valor elegido. Me gusta bastante 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 siempre subiendo o los valores se distribuyen uniformemente, es posible generar el resultado de la tirada en O (1) usando un enfoque ingenuo, aunque mi solución todavía tomará muchos pasos logarítmicos.
¿Alguien tiene alguna sugerencia sobre cómo resolver este problema de una manera que de alguna manera es "adaptable" en su tiempo de ejecución?
EDITAR: Sobre la base de las respuestas a esta pregunta, he redactado an article describing many approaches to this problem, junto con sus análisis. Parece que la implementación de Vose del método de alias da Θ (n) tiempo de preprocesamiento y O (1) tiempo por tirada de dado, lo cual es realmente impresionante. ¡Espero que esto sea una adición útil a la información contenida en las respuestas!
Es razonable que exista una solución O (1) para cada caso específico. – Tim