Załóżmy, że mam n-stronną kostkę obciążoną, w której każda strona k ma pewne prawdopodobieństwo, że p k wypadnie, gdy ją rzucę. Ciekawe, czy istnieje dobry algorytm do przechowywania tych informacji w sposób statyczny (tj. Dla ustalonego zestawu prawdopodobieństw), aby móc skutecznie zasymulować losowy rzut kostką.
Obecnie mam rozwiązanie O (lg n) dla tego problemu. Chodzi o to, aby zapisać tabelę skumulowanego prawdopodobieństwa pierwszych k stron dla wszystkich k, wygenerować losową liczbę rzeczywistą z zakresu [0, 1) i przeprowadzić wyszukiwanie binarne w tabeli, aby uzyskać największy indeks, którego skumulowany wartość nie jest większa niż wybrana wartość. Raczej podoba mi się to rozwiązanie, ale wydaje mi się dziwne, że środowisko wykonawcze nie bierze pod uwagę prawdopodobieństw. W szczególności w ekstremalnych przypadkach, gdy jedna strona zawsze się podnosi lub wartości są równomiernie rozłożone, możliwe jest wygenerowanie wyniku rzutu w O (1) przy użyciu naiwnego podejścia, chociaż moje rozwiązanie nadal będzie wymagało logarytmicznie wielu kroków.
Czy ktoś ma jakieś sugestie, jak rozwiązać ten problem w sposób, który jest w jakiś sposób „adaptacyjny” w jego środowisku wykonawczym?
EDYCJA : Na podstawie odpowiedzi na to pytanie napisałem artykuł opisujący wiele podejść do tego problemu wraz z ich analizami. Wygląda na to, że implementacja metody aliasów przez Vose'a daje Θ (n) czas przetwarzania wstępnego i O (1) czas na rzut kostką, co jest naprawdę imponujące. Mamy nadzieję, że jest to przydatne uzupełnienie informacji zawartych w odpowiedziach!