Random 如何从指定的离散分布生成随机数?

Random 如何从指定的离散分布生成随机数?,random,probability,Random,Probability,假设我们有一些可能结果有限的离散分布,从这个分布生成一个随机数是否可能比在O(logn)中更快,其中n是可能结果的数量 如何使用O(logn): -用累积概率(数组[i]=随机数小于或等于i的概率)创建一个数组 -从均匀分布生成随机数(用k表示) -求最小的i,使k

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

如何使用O(logn):
-用累积概率(数组[i]=随机数小于或等于i的概率)创建一个数组
-从均匀分布生成随机数(用k表示)
-求最小的i,使k
-i是我们的随机数。

Walker的别名方法可以在恒定的最坏情况下使用一些需要预先计算的大小为n的辅助数组来抽取样本。此方法在的第3章中介绍,并在R sample()函数中实现。您可以从R的源代码或。A声称可以降低初始化成本

请注意,除非您指定输入的确切形式以及要绘制的随机数的数量,否则您的问题并没有得到很好的定义。例如,如果输入是一个给出每个结果概率的数组,那么您的算法不是O(logn),因为它需要首先计算从输入数组中花费O(n)时间的累积概率


如果您打算绘制多个样本,那么生成单个样本的成本就不那么重要了。相反,重要的是生成m个结果的总成本,以及所需的峰值内存。在这方面,别名方法非常好。如果要一次生成所有样本,请使用发布的O(n+m)算法,然后将结果洗牌。

@Tomek,请记住奖励奖金。@Kos:谢谢,我不知道我必须奖励奖金,我认为这是一件自动的事情。如果你忽略了及时给自己奖励,一半的奖金会自动奖励给最好的答案,AFAICR。