假设我有一个 N面加载的骰子,其中每一面 K都有一定的概率 P < sub > K 当我掷骰子时出现。我很好奇是否有一个好的数据结构来静态地存储这些信息(例如,对于一组固定的概率) ,这样我就可以有效地模拟随机的骰子。
目前,我有一个 O (lgN)解决这个问题。这个想法是存储所有 K的第一个 K边的累积概率表,然后在范围[0,1)内生成一个随机实数,并对表进行二进制搜索,以获得累积值不大于所选值的最大索引。
我非常喜欢这个解决方案,但是运行时没有考虑到这种可能性似乎有点奇怪。特别是,在极端情况下,如果一边总是出现或者值是均匀分布的,可以使用简单的方法在 O (1)中生成滚动的结果,而我的解决方案仍然需要对数多个步骤。
有人对如何在运行时以某种“适应性”的方式解决这个问题有什么建议吗?
更新: 根据对这个问题的回答,我写了 一篇描述解决这个问题的许多方法的文章,以及他们的分析。看起来 Vose 对 alias 方法的实现给出了 Θ (N)的预处理时间和每个骰子辊的 O (1)时间,这真是令人印象深刻。希望这是对包含在答案中的信息的一个有用的补充!