在给定概率分布的情况下获取随机值而不替换

时间:2016-12-11 13:11:27

标签: algorithm math random language-agnostic

给定概率分布 - 对象到其概率的映射 - 我想要一种从地图中选择随机对象并且没有替换的算法(每次选择更新概率分布)。但是,该算法必须具有O(1)空间复杂度并具有高质量随机性。我尝试搜索实现,但它们似乎都没有这两个属性。

编辑:

没有替换的概率: 你有一袋物品,每个物体都有被选中的概率。选择对象后,将其从包中取出。现在所有对象的选择概率都不同。

对于O(1)空间复杂度,我们不存储具有根据其被选择概率重复的对象的列表。相反,我们只存储概率分布迭代置换(但不存储该置换)。

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。