假设我有一个n面加载的模具,其中每边k 滚动时都有几率p k上升。我很好奇是否有一个好的算法可以静态地存储此信息(即固定的概率集),以便我可以有效地模拟骰子的随机滚动。
目前,我有一个O(lg n)解决方案。这个想法是存储所有k的前k个边的累积概率表,它们生成[0,1)范围内的随机实数,并对该表执行二进制搜索以获取其累加最大索引。值不大于所选值。我更喜欢这种解决方案,但是运行时没有考虑到这些可能性似乎很奇怪。特别是,在极端情况下,一侧总是出现或值均匀分布,尽管我的解决方案仍将采用对数步的许多方法,但可以通过朴素的方法在O(1)中生成滚动结果。
有人对运行时以某种“自适应”方式解决此问题有任何建议吗?
编辑:基于对这个问题的回答,我写了一篇文章,描述了解决这个问题的许多方法以及它们的分析。看起来Vose对别名方法的实现为每个模具辊提供了Θ(n)预处理时间和O(1)时间,这确实令人印象深刻。希望这是对答案中包含的信息的有用补充!