Random Event Image Script 按设定概率随机生成图片的实现技巧及示例咨询
按概率生成指定图片的实现方案
核心实现思路
- 先把所有图片和对应的概率做绑定,生成权重映射表
- 计算所有概率的总和(如果是百分比配置的话总和一般为100,该逻辑也支持非标准化的权重配置,不需要提前做百分比转换)
- 生成一个0到总权重之间的随机数
- 遍历权重映射表做累加,随机数落在哪个图片对应的区间就返回对应的图片
注意:如果后续要新增图片、调整概率,只需要修改权重映射表即可,不需要调整核心逻辑
开发技巧
- 概率配置建议单独抽成独立配置项,不要硬编码在逻辑中,后续调整概率不需要改动核心功能代码
- 如果有几十张以上的图片需要分配概率,可以提前预计算累加区间数组,单次匹配的时间复杂度可以降到O(log n),比普通遍历效率高很多
- 功能开发完成后可以写个循环跑10万次以上的测试,统计每个图片的出现频率,验证实际概率是否符合预期配置
Python 代码示例
import random from collections import defaultdict def get_image_by_prob(prob_map: dict): # 计算总权重 total_weight = sum(prob_map.values()) # 生成0到总权重的随机浮点数 rand_num = random.uniform(0, total_weight) current_sum = 0 for img_path, weight in prob_map.items(): current_sum += weight if rand_num <= current_sum: return img_path if __name__ == "__main__": # 配置图片和对应概率,直接填百分比数值即可 image_prob_config = { "1_image.png": 5, "image_2.png": 95 } # 单次调用获取图片 selected_img = get_image_by_prob(image_prob_config) print(f"本次选中的图片是: {selected_img}") # 测试概率准确性 跑10万次统计结果 test_count = 100000 count_result = defaultdict(int) for _ in range(test_count): img = get_image_by_prob(image_prob_config) count_result[img] += 1 print("\n10万次测试的统计结果:") for img, cnt in count_result.items(): print(f"{img}: 出现次数{cnt}, 实际占比{cnt/test_count*100:.2f}%")
运行说明
直接运行脚本即可看到效果,10万次测试后1_image.png的占比基本稳定在4.9%5.1%区间,`image_2.png`的占比稳定在94.9%95.1%区间,和预期的概率配置一致。
内容的提问来源于stack exchange,提问作者sawyer1234
相关产品推荐
相关产品推荐

