Припустимо, що у мене є n-сторона, завантажена штампом, де кожна сторона k має певну ймовірність p k, що підніметься, коли я її перекидаю. Мені цікаво, чи є хороший алгоритм для стаціонарного зберігання цієї інформації (тобто для фіксованого набору ймовірностей), щоб я міг ефективно імітувати випадковий рулон матриці.
Наразі у мене є рішення O (lg n) для цієї проблеми. Ідея полягає в тому, щоб зберегти таблицю сукупної ймовірності перших k сторін для всіх k, щоб вони генерували випадкове дійсне число в діапазоні [0, 1) і здійснювали двійковий пошук над таблицею, щоб отримати найбільший індекс, кумулятивний значення не більше вибраного значення. Мені більше подобається це рішення, але здається дивним, що час виконання не враховує ймовірності. Зокрема, у крайніх випадках, коли одна сторона завжди піднімається або значення розподіляються рівномірно, можна генерувати результат рулону в O (1), використовуючи наївний підхід, хоча моє рішення все-таки буде робити логарифмічні багато кроків.
Хтось має якісь пропозиції, як вирішити цю проблему способом, який якимось чином "адаптується" під час виконання?
EDIT : На основі відповідей на це питання я написав статтю, в якій описував багато підходів до цієї проблеми , разом з їх аналізами. Схоже, реалізація методу псевдоніма Vose дає Θ (n) час попередньої обробки та час (O) (1) час за відкат, що справді вражає. Сподіваємось, це корисне доповнення до інформації, що міститься у відповідях!