Supponiamo che io abbia un dado caricato a lato N in cui ogni lato k ha qualche probabilità p k di salire quando lo lancio. Sono curioso di sapere se esiste un buon algoritmo per la memorizzazione statica di queste informazioni (cioè per un insieme fisso di probabilità) in modo da poter simulare in modo efficiente un tiro casuale del dado.
Attualmente, ho una soluzione O (lg n) per questo problema. L'idea è di memorizzare una tabella della probabilità cumulativa dei primi k lati per tutti i k, per generare un numero reale casuale nell'intervallo [0, 1) ed eseguire una ricerca binaria sopra la tabella per ottenere l'indice più grande il cui cumulativo il valore non è maggiore del valore scelto. Preferisco questa soluzione, ma sembra strano che il runtime non tenga conto delle probabilità. In particolare, nei casi estremi di un lato sempre crescente o di distribuzione uniforme dei valori, è possibile generare il risultato del rollio in O (1) usando un approccio ingenuo, sebbene la mia soluzione continuerà a fare logaritmicamente molti passi.
Qualcuno ha qualche suggerimento su come risolvere questo problema in un modo che è in qualche modo "adattivo" nel suo runtime?
EDIT : sulla base delle risposte a questa domanda, ho scritto un articolo che descrive molti approcci a questo problema , insieme alle loro analisi. Sembra che l'implementazione del metodo alias da parte di Vose dia Θ (n) tempo di preelaborazione e O (1) tempo per tiro di dado, il che è davvero impressionante. Speriamo che questa sia un'utile aggiunta alle informazioni contenute nelle risposte!