给定概率分布 - 对象到其概率的映射 - 我想要一种从地图中选择随机对象并且没有替换的算法(每次选择更新概率分布)。但是,该算法必须具有O(1)空间复杂度并具有高质量随机性。我尝试搜索实现,但它们似乎都没有这两个属性。
编辑:
没有替换的概率: 你有一袋物品,每个物体都有被选中的概率。选择对象后,将其从包中取出。现在所有对象的选择概率都不同。
对于O(1)空间复杂度,我们不存储具有根据其被选择概率重复的对象的列表。相反,我们只存储概率分布和迭代置换(但不存储该置换)。
答案 0 :(得分:0)
我会尝试变种Fisher-Yates-Knuth shuffle(在Durstenfeld实施中它是O(1))
原件:
for i from 0 to n − 1 do
j ← random integer such that 0 ≤ j ≤ i
if j ≠ i
a[i] ← a[j]
a[j] ← source[i]
修改以满足要求:
for i from 0 to n − 1 do
p ← probabilities(n-i)
j ← random integer via probabilities(n-i) such that 0 ≤ j ≤ i
if j ≠ i
a[i] ← a[j]
a[j] ← source[i]
因此,在每个步骤中,您都会更新概率并使用它们来对索引进行采样。之后,它只是FYK shuffle。