You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

随机调用含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.0901
  • ln(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:47:22