Python如何实现线性加权随机分布:低值高频、高值稀有
实现线性递减概率随机函数的方案
你需要的1~100数值概率线性递减的需求,可以通过权重匹配或者逆变换采样实现,核心逻辑是给每个数值分配和概率成正比的权重:数值k的权重为101 - k,即1权重为100、100权重为1,概率刚好随数值升高线性降低。
方案1:简洁易读实现(适合低频调用)
直接使用Python内置的random.choices方法指定权重即可:
import random def getPercentContent(): # 生成1~100每个数对应的权重,线性递减 num_range = range(1, 101) weights = [101 - num for num in num_range] # 按权重随机选择一个数 return str(random.choices(num_range, weights=weights, k=1)[0])
方案2:高性能实现(适合高频调用)
通过数学计算直接生成结果,避免每次遍历权重列表,性能提升明显:
import random import math # 预计算所有权重总和,固定值为 100*101/2 = 5050 TOTAL_WEIGHT = 5050 def getPercentContent(): # 生成1到总权重之间的随机整数 rand_val = random.randint(1, TOTAL_WEIGHT) # 解二次方程直接定位到对应的数值 result = (201 - math.isqrt(201 * 201 - 8 * rand_val)) // 2 return str(result)
效果验证
两种方案生成的随机数都满足:
- 1的出现概率约为1.98%,是所有数值中最高的
- 100的出现概率约为0.02%,是所有数值中最低的
- 相邻数值的概率差固定为0.0198%,完全符合线性递减的要求
内容的提问来源于stack exchange,提问作者frankied003
相关产品推荐
相关产品推荐

