您如何看待以下执行随机抽样的方法:
- 使用量子随机发生器生成与个体一样多的浮点数(0 到 1 之间)(每个值仅出现一次)。
- 将花车分配给个人。
- 根据花车的顺序对个人进行排序。
- 根据需要选择个人。
既然发电机质量好,用这种方法有风险吗?
您如何看待以下执行随机抽样的方法:
既然发电机质量好,用这种方法有风险吗?
从理论上讲,这是一个很好的方法。 要了解原因,我们需要检查两件事。
所有的人都以平等的机会被选中吗?是的,因为分配给每个人的花车分布是相同的(它们在)。
选择是独立的吗?是的,因为分配给个人的浮点数是独立的(大概:这是“高质量”随机数生成器的一部分)。
然而,这种方法在计算时间和内存资源方面往往效率低下。它需要时间和从人群中选择的记忆. 两者通常都可以改进,有时甚至是很大的改进。
通用算法首先考虑您需要抽样的总体数量。如果超过人口的一半,则识别不在样本中的个体并选择其余的个体(代价为时间)。这让我们只能识别出不超过一半的人口,比如说在......之外个人(与)。让他们的标识符在一个数组中population[0..n-1]
:
i = 0
selection = new set
while (i < k) {
x = random float in [0,1)
j = int(x * (n-i))
adjoin population[j] to selection
population[j] = population[n-1-i]
i++
}
return selection
关键步骤——将最后一个个体复制population[n-i-i]
到最近选择的个体腾出的空间中population[j]
——实际上并不需要整个population[]
数组都在 RAM 中:您可以使用而是指针。这使得计算时间而不是但减少了存储需求至,这对于从离线存储的大量人群中进行的少量选择来说可能很重要。
该算法有效的证明是归纳的。显然它适用于. 对于一般, 并假设random float
程序是一个好的过程,那么在第一步 (a) 每个人都以相等的概率被选择,并且 (b) 该选择独立于下一步,即选择来自人群的个体. 因为这(归纳地)被认为是正确的,所以我们完成了。