如何利用Numpy高效检测含重复元素的骰子投掷组合?
解决骰子组合检测的高效方法
核心思路
要准确检测投掷结果是否包含指定组合(支持重复数字),关键是统计每个数字的出现次数,而非仅判断元素是否存在。只有当目标组合中每个数字的需求次数都不超过投掷结果中对应数字的实际出现次数时,才能判定该组合存在。
具体实现(基于Numpy)
利用Numpy的np.bincount高效统计数字频率,通过对比频率数组完成检测:
import numpy as np def has_combination(roll_result, target_combination): # 统计投掷结果中1-6的出现次数(跳过索引0,对应数字0) roll_counts = np.bincount(roll_result, minlength=7)[1:] # 统计目标组合的数字出现次数 target_counts = np.bincount(target_combination, minlength=7)[1:] # 检查所有目标数字的需求次数是否均不超过投掷结果的现有次数 return np.all(target_counts <= roll_counts)
代码说明
np.bincount: 快速统计非负整数的出现频次,minlength=7确保结果覆盖数字0-6,取[1:]直接得到1-6每个骰子点数的出现次数。np.all(target_counts <= roll_counts): 逐个验证目标组合的每个数字需求是否被满足,全满足则返回True,否则返回False。
示例验证
针对你提供的投掷结果roll = np.array([1,4,5,2,4,4]):
- 检测6个3:
has_combination(roll, np.array([3,3,3,3,3,3]))→ 返回False - 检测3个4:
has_combination(roll, np.array([4,4,4]))→ 返回True - 检测1-6各一个:
has_combination(roll, np.array([1,2,3,4,5,6]))→ 返回False
完全符合预期结果,且能正确处理含重复元素的组合检测。
内容的提问来源于stack exchange,提问作者Chris Browne
相关产品推荐
相关产品推荐

