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

如何用NumPy实现生成模拟人群手机每日拿起次数的函数

实现方案说明

首先纠正你对函数参数的误解:从给定的测试代码可以看出,get_population的三个参数分别是:

  • 第一个参数pickups:期望的总体均值(测试用例传入45,断言要求返回的总体均值和45的差值小于0.5)
  • 第二个参数pop_size:总体的个体数量(测试用例传入5000)
  • 第三个参数不是标准差,是随机种子(测试用例传入42,用来固定随机生成结果,保证断言可稳定通过)

另外你提到用np.random.randint是不合适的,均匀分布生成的整数无法满足「标准差接近均值的平方根」的要求。结合拿起手机次数是离散计数类数据的特征,以及测试断言要求pop_std ≈ np.sqrt(45),正好匹配泊松分布的特性:泊松分布的均值和方差相等,标准差就是均值的平方根,完全符合需求。


完整实现代码

import numpy as np

def get_population(pickups, pop_size, random_seed):
    # 设置随机种子保证结果可复现
    np.random.seed(random_seed)
    # 用泊松分布生成每个个体的每日拿起手机次数,λ为期望均值pickups
    pop_pickups = np.random.poisson(lam=pickups, size=pop_size)
    # 计算总体均值
    pop_mean = np.mean(pop_pickups)
    # 计算总体标准差(ddof=0代表总体标准差,不是样本标准差)
    pop_std = np.std(pop_pickups, ddof=0)
    return pop_pickups, pop_mean, pop_std

验证说明

你可以直接运行给定的测试代码:

pop_pickups, pop_mean, pop_std = get_population(45, 5000, 42)
assert np.abs(pop_mean - 45) < 0.5, "Get population problem, testing pop_mean, population mean returned does not match expected population mean"
assert np.abs(pop_std - np.sqrt(45)) < 0.5, "Get population problem, testing pop_std, population standard deviation returned does not match expected standard deviation"

运行后不会触发断言报错,完全符合测试要求。生成的pop_pickups就是长度为5000的数组,每个元素对应一个个体每日拿起手机的次数,可以直接用于后续的抽样作业。

内容的提问来源于stack exchange,提问作者Hefe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 22:45:04