【发布时间】:2011-05-11 13:42:02
【问题描述】:
假设我们有一些离散分布,可能的结果数量有限,是否有可能从这个分布中生成一个随机数,比在 O(logn) 中更快,其中 n 是可能的结果数?
如何在 O(logn) 中实现:
- 制作一个具有累积概率的数组(Array[i] = 随机数小于或等于 i 的概率)
- 从均匀分布中生成随机数(用 k 表示)
- 找到最小的 i 使得 k
- i 是我们的随机数。
【问题讨论】:
标签: random probability
假设我们有一些离散分布,可能的结果数量有限,是否有可能从这个分布中生成一个随机数,比在 O(logn) 中更快,其中 n 是可能的结果数?
如何在 O(logn) 中实现:
- 制作一个具有累积概率的数组(Array[i] = 随机数小于或等于 i 的概率)
- 从均匀分布中生成随机数(用 k 表示)
- 找到最小的 i 使得 k
- i 是我们的随机数。
【问题讨论】:
标签: random probability
Walker 的别名方法可以使用一些需要预先计算的大小为 n 的辅助数组,以恒定的最坏情况时间绘制样本。此方法在Devroye's book on sampling 的第 3 章中进行了描述,并在 R sample() 函数中实现。您可以从 R 的源代码或this thread 获取代码。 1991 paper by Vose 声称可以降低初始化成本。
请注意,除非您指定输入的确切形式以及要绘制多少个随机数,否则您的问题没有明确定义。例如,如果输入是一个给出每个结果概率的数组,那么您的算法不是 O(log n),因为它需要首先计算从输入数组花费 O(n) 时间的累积概率。
如果您打算抽取多个样本,那么生成单个样本的成本就不是那么重要了。相反,重要的是生成 m 个结果的总成本,以及所需的峰值内存。在这方面,别名方法非常好。如果您想一次生成所有样本,请使用 here 发布的 O(n+m) 算法,然后随机播放结果。
【讨论】: