【发布时间】:2009-06-08 17:57:53
【问题描述】:
假设我有一个名为elements 的列表,每个列表都满足或不满足某个布尔属性p。我想通过均匀分布随机选择满足p 的元素之一。我提前不知道有多少项目满足这个属性p。
下面的代码会这样做吗?:
pickRandElement(elements, p)
randElement = null
count = 0
foreach element in elements
if (p(element))
count = count + 1
if (randInt(count) == 0)
randElement = element
return randElement
(randInt(n) 返回一个随机整数 k 和 0 <= k < n。)
【问题讨论】:
-
我会认为“随机”和“平均分配”是相互排斥的,我错过了什么?
-
@Binary:他只是意味着它必须是一个公平的随机数。所有满足 p 的元素每次都必须有相同的机会被随机选择。如果这是真的,那么只要有足够的时间,它们就会被平均分配。
-
随机分布可以有各种形状,这些形状可能会偏向一组元素或另一组元素。在这里,保罗问的是一个均匀(或均匀)分布,其中每个元素都有相同的被选中概率。
-
@Nate,目前尚不清楚每个元素具有相等的概率。我的阅读是 P 组和 Not-P 组具有相等的概率。如果每个元素都是一致的,那么我的答案就离得很远了.... ;-)
-
没有必要使用浮点数。就个人而言,我只是选择一个介于 0 和 count - 1 之间的随机整数,然后选择结果为 0 的元素。这样更有效,并且可以保护您免受舍入错误。
标签: algorithm arrays statistics probability