如果场景对象逐个出现,而总数量事先未知,可以只保留一个候选。关键不是总用新对象覆盖,而是让第i个对象以一除以i的概率替换当前候选。
固定规则与输入
本例每一步从一至i等可能取整数,取到一时替换为第i个对象,否则保留。所有随机选择相互独立。记录中的整数是演示输入,真实执行时仍需要满足已声明的抽样规则。
对象依次为一至13,六次独立演示;整数一触发替换。
逐步观察结果
运行1各步整数[1, 2, 2, 1, 4, 1, 7, 3, 6, 6, 1, 5, 13],每步结束保留对象[1, 1, 1, 4, 4, 6, 6, 6, 6, 6, 11, 11, 11],最终对象11。每一位整数的可选范围随步数扩大,不能把所有步骤都从同一固定范围抽取。
运行2各步整数[1, 2, 2, 1, 2, 1, 1, 4, 7, 5, 6, 5, 3],每步结束保留对象[1, 1, 1, 4, 4, 6, 7, 7, 7, 7, 7, 7, 7],最终对象7。每一位整数的可选范围随步数扩大,不能把所有步骤都从同一固定范围抽取。
运行3各步整数[1, 2, 2, 3, 1, 4, 2, 4, 6, 2, 5, 11, 4],每步结束保留对象[1, 1, 1, 1, 5, 5, 5, 5, 5, 5, 5, 5, 5],最终对象5。每一位整数的可选范围随步数扩大,不能把所有步骤都从同一固定范围抽取。
运行4各步整数[1, 1, 1, 4, 3, 1, 3, 6, 3, 6, 6, 12, 6],每步结束保留对象[1, 2, 3, 3, 3, 6, 6, 6, 6, 6, 6, 6, 6],最终对象6。每一位整数的可选范围随步数扩大,不能把所有步骤都从同一固定范围抽取。
运行5各步整数[1, 2, 2, 4, 2, 6, 5, 8, 1, 7, 10, 6, 10],每步结束保留对象[1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9],最终对象9。每一位整数的可选范围随步数扩大,不能把所有步骤都从同一固定范围抽取。
运行6各步整数[1, 1, 3, 2, 4, 2, 3, 2, 4, 3, 10, 6, 12],每步结束保留对象[1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],最终对象2。每一位整数的可选范围随步数扩大,不能把所有步骤都从同一固定范围抽取。
理想独立等概率抽取下,每个对象最终概率都是1/13。这里六次实际结果可能重复,重复本身不能证明算法偏向某个对象,应把单次路径和分布结论分开。
独立复核
第i步之前每个旧对象概率为一除以i减一,再乘本步不替换概率,就得到一除以i;新对象也以一除以i入选。最终一次运行只留下一个对象,不能从单次结果推断概率偏差。
复核时先保留本例输入,再自己写出中间状态。若结果不同,应从最早出现差异的位置检查,尤其留意边界是否包含、索引从哪里开始、取整何时发生,以及是否使用了尚未更新的旧状态。计算得到的结论仅适用于已经说明的规则,修改规则后需要重新验证。
适用范围
这里是无权重抽样,每个对象身份独立。如果要按面积、重要度或可见时长加权,应改用相应规则。也不要把同一个对象重复传入后仍声称每个不同对象等概率。
