【问题标题】:How to generate a random number from specified discrete distribution?如何从指定的离散分布生成随机数?
【发布时间】:2011-05-11 13:42:02
【问题描述】:

假设我们有一些离散分布,可能的结果数量有限,是否有可能从这个分布中生成一个随机数,比在 O(logn) 中更快,其中 n 是可能的结果数?

如何在 O(logn) 中实现:
- 制作一个具有累积概率的数组(Array[i] = 随机数小于或等于 i 的概率)
- 从均匀分布中生成随机数(用 k 表示)
- 找到最小的 i 使得 k - i 是我们的随机数。

【问题讨论】:

    标签: random probability


    【解决方案1】:

    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) 算法,然后随机播放结果。

    【讨论】:

    • @Tomek,请记得奖励赏金。
    • @Kos:谢谢,我不知道我必须奖励赏金,我认为这是一个自动的事情。
    • 如果您忽略自己及时奖励,AFAICR 会自动将一半的赏金奖励给评分最高的答案。
    猜你喜欢
    • 2012-04-21
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 2014-05-18
    • 2017-05-10
    相关资源
    最近更新 更多