随机调用含10万条记录的数组,需多少次才能获取至少80%记录?
解答:收集至少80%数组元素的期望抽样次数
嘿,这个问题本质是部分优惠券收集问题的典型场景,咱们结合数学推导和实际数值来拆解它:
先明确问题前提
首先要确认:你这里的ary.sample是有放回抽样(原数组元素不会被移除,每次都从完整的10万条记录里随机选一个),对吧?如果是无放回的话那最多10万次就能拿完,但你的描述里说只能随机调用不能遍历,所以应该是有放回的情况,这也是我们下面计算的基础。
核心数学公式
当我们从N个唯一元素中,有放回抽样直到收集到m个不同元素时,所需的期望抽样次数可以用调和数来计算:
E = N × (H_N - H_{N - m})
这里的H_k是第k个调和数,简单说就是H_k = 1 + 1/2 + 1/3 + ... + 1/k。
代入你的参数
你的数组总元素数N=100000,目标是收集至少80%也就是m=80000个不同元素,那N - m=20000,代入公式后:
E = 100000 × (H_100000 - H_20000)
近似计算(因为N很大,不用精确求和)
对于大数值的k,调和数可以用自然对数近似,公式是:H_k ≈ ln(k) + γ
其中γ是欧拉-马歇罗尼常数,大概是0.5772。
咱们算一下:
ln(100000) ≈ 11.5129,所以H_100000 ≈ 11.5129 + 0.5772 ≈ 12.0901ln(20000) ≈ 9.9035,所以H_20000 ≈ 9.9035 + 0.5772 ≈ 10.4807
两者的差值是12.0901 - 10.4807 = 1.6094,所以期望次数:E ≈ 100000 × 1.6094 = 160940
实际参考意义
这个16万次是期望次数,意思是:
- 你抽样大约16万次时,有50%的概率已经收集到了至少80%的不同元素;
- 如果想要更高的置信度(比如95%概率达成目标),需要的次数会更多——可以通过蒙特卡洛模拟得到,但期望次数已经能给你一个非常实用的基准值。
小例子验证(可选)
比如拿N=10,目标8个元素来测试:
精确调和数H_10≈2.92897,H_2=1.5,差值≈1.42897,期望次数≈10×1.42897≈14.3次,和实际模拟的结果一致,说明这个公式是靠谱的。
内容的提问来源于stack exchange,提问作者konung
相关产品推荐
相关产品推荐

