方法与代码
- 方法论:参考1可以看到,最终把从一个离散分布中生成样本看做是投一个无偏的骰子(骰子有多少面取决于这个离散分布的总数量),然后抛一枚有偏硬币(如果中了1,返回这个无偏骰子的面数;中了0,返回另一个面数),因为全部样本的概率被切分又合并成为一个正方形,每一个列最多包含两个离散值的概率。具体见参考1
- 参考:
1.http://www.keithschwarz.com/darts-dice-coins/
2.https://lips.cs.princeton.edu/the-alias-method-efficient-sampling-with-many-discrete-outcomes - 按照参考1的伪代码写的:
# Author:ZC
class Alias:
def __init__(self, prolist):
self.pro = prolist
self.Initialization()
def Initialization(self):
self.N = len(self.pro)
self.alias, self.prob = [0] * self.N, [0] * self.N
small, large =