基于Python random库的随机数选取及后续5个数概率计算问询
技术方案:计算随机数中目标值的概率与实际频率
嘿,我来帮你梳理这个问题的解决方案~你已经会用Python的random库生成0-20区间的随机数了,现在要针对选定的某个数(比如10)计算相关概率,其实可以分成理论概率分析和实际频率验证两部分来做,具体内容如下:
一、理论概率分析
首先明确random.randint(0, 20)的特性:它会生成包含0和20在内的21个整数,并且每个整数的出现概率是均匀相等的。基于这个前提:
- 单个随机数等于目标数(比如10)的理论概率是:
1/21 ≈ 4.76% - 如果要计算「5个随机数中至少出现一次目标数」的理论概率,可以用反向计算法:先算5个随机数都不是目标数的概率
(20/21)^5,再用1减去这个值,结果约为21.6%
二、代码实现:实际频率验证(近似概率)
理论概率是固定的,但实际运行中我们可以通过大量重复试验来统计频率(频率会随着试验次数增加趋近于理论概率,这就是大数定律)。下面是完整的代码实现:
import random # 配置核心参数 target_num = 10 # 你选定的目标数 total_trials = 10000 # 总试验次数,次数越多结果越接近理论值 nums_per_trial = 5 # 每次试验生成的随机数数量 # 统计1:单个随机数命中目标的总次数 total_target_hits = 0 total_generated_nums = total_trials * nums_per_trial for _ in range(total_trials): for _ in range(nums_per_trial): if random.randint(0, 20) == target_num: total_target_hits += 1 # 统计2:每组5个随机数中至少命中一次目标的试验次数 successful_trials = 0 for _ in range(total_trials): # 检查当前组的5个随机数是否有目标数 has_target = any(random.randint(0, 20) == target_num for _ in range(nums_per_trial)) if has_target: successful_trials += 1 # 计算并输出结果 single_num_freq = total_target_hits / total_generated_nums trial_success_freq = successful_trials / total_trials print(f"单个随机数等于{target_num}的实际频率:{single_num_freq:.4f}(理论概率:{1/21:.4f})") print(f"5个随机数中至少出现一次{target_num}的实际频率:{trial_success_freq:.4f}(理论概率:{1 - (20/21)**5:.4f})")
代码说明
- 我们设置了10000次试验,每次生成5个随机数,这样总共有50000个随机数样本,结果会更接近理论值
- 代码统计了两个维度的频率:单个随机数命中目标的频率,以及每组5个随机数中至少一次命中的频率
- 如果只是想单次生成5个随机数并统计其中目标数的出现次数,直接去掉循环,生成一次5个数然后计数即可,但这只能得到单次结果,不能代表概率
三、额外提醒
random.randint(a, b)生成的是闭区间[a, b]的整数,所以0到20一共21个值,这个是计算理论概率的关键- 如果需要更严谨的随机数(比如加密场景),可以考虑使用
secrets库,但日常测试用random完全足够
内容的提问来源于stack exchange,提问作者vaibhav




