如何用Python实现按给定概率从SKU列表中随机选取指定数量商品?
嗨,我来帮你把Excel里的拣货清单逻辑搬到Python里,一步步来很简单的!
首先,先帮你拆解一下你找到的那个random_pick函数——它其实完美实现了你Excel公式的核心逻辑:
Excel里是生成一个0-1的随机数,然后找第一个累积概率大于这个随机数的SKU;这个Python函数也是一样:生成随机数
x,然后遍历SKU和对应的单个概率,累加得到累积概率,一旦累加值超过x,就返回当前SKU,和你的Excel公式逻辑完全匹配。
接下来分三步实现你的需求:
1. 把Excel数据读进Python
首先你需要把Excel里的SKU列表和对应的概率(注意是单个SKU的概率,不是累积概率,函数会自己累加)读取到Python里。推荐用pandas来处理Excel,代码大概是这样:
import pandas as pd # 替换成你的Excel文件路径和列名 df = pd.read_excel("你的库存数据.xlsx") sku_list = df["SKU列的名称"].tolist() # 比如你Excel里SKU在A列,就填"A"或者列的实际名称 probabilities = df["单个概率列的名称"].tolist() # 对应你计算的每个SKU的概率列
⚠️ 注意:要保证SKU列表和概率列表的顺序完全和Excel一致(按销量从高到低排序),而且所有概率的总和要接近1(允许微小的浮点误差)。
2. 批量生成20个SKU的拣货清单
有了数据之后,只需要循环调用random_pick函数20次就行,用列表推导式很简洁:
import random def random_pick(some_list, probabilities): x = random.uniform(0, 1) cumulative_probability = 0.0 for item, item_probability in zip(some_list, probabilities): cumulative_probability += item_probability if x < cumulative_probability: break return item # 生成20个SKU的拣货清单 pick_list = [random_pick(sku_list, probabilities) for _ in range(20)] # 打印结果看看 print("生成的拣货清单:") for sku in pick_list: print(sku)
3. (可选)用累积概率优化效率
如果你已经有了Excel里算好的累积概率列表,可以用bisect模块来优化速度(尤其是数据量很大的时候),逻辑和Excel的COUNTIF完全对齐:
import bisect import random def random_pick_with_cumulative(some_list, cumulative_probs): x = random.uniform(0, 1) # bisect_right找到第一个大于x的累积概率的索引,和Excel的COUNTIF结果+1逻辑一致 index = bisect.bisect_right(cumulative_probs, x) return some_list[index] # 假设你已经把Excel里的累积概率列读成了cumulative_probabilities列表 pick_list = [random_pick_with_cumulative(sku_list, cumulative_probabilities) for _ in range(20)]
小提示
- 如果需要避免重复选取同一个SKU,可以在生成的时候判断是否已加入列表,但你的Excel公式是允许重复的,所以默认和Excel保持一致;
- 可以多运行几次看看结果,销量高的SKU(概率大)应该会更频繁地被选中,这就说明逻辑是对的。
内容的提问来源于stack exchange,提问作者Karim.C
相关产品推荐
相关产品推荐

