Python中如何用随机数匹配多列表?文本游戏概率机制实现遇阻
Python文本游戏概率匹配问题解决
问题背景
我正在为学校制作一款Python文本类游戏,因常玩RuneScape,希望加入概率机制而非强制怪物交互。设置了四种稀有度(common 1/5、uncommon 1/15等),想在地牢的每个阶段通过掷随机数确定怪物等级/难度,再让用户输入操作。
尝试将稀有度及其对应数值范围存入字典,用for循环匹配randint生成的随机数,但无法实现,还触发错误:TypeError: unhashable type: 'list'
原代码:
import random rolls = {'common': list(range(1, 6)), 'uncommon': list(range(6, 21)), 'rare': list(range(21, 46)), 'omg': list(range(46, 146))} chance = random.randint(1,146) for i in rolls: if i == chance: print(i)
问题分析
- 循环逻辑错误:遍历
rolls时,i是字典的键(如'common'),不是对应数值列表,拿字符串和随机整数比较永远不会匹配。 - 没必要用列表存区间:把数值范围转成列表既浪费内存,也增加判断复杂度。
TypeError大概率是你其他变体代码里把列表当作字典的键使用了(字典键必须是可哈希类型,列表不可哈希)。
修正方案
方案一:区间直接判断(逻辑清晰)
import random # 生成1-145的随机数,对应你设置的区间范围 chance = random.randint(1, 145) rarity = None if 1 <= chance <= 5: rarity = 'common' elif 6 <= chance <= 20: rarity = 'uncommon' elif 21 <= chance <= 45: rarity = 'rare' elif 46 <= chance <= 145: rarity = 'omg' print(f"遭遇稀有度为 *{rarity}* 的怪物!")
方案二:权重列表法(简洁易扩展)
直接用重复元素的数量对应概率权重,random.choice会随机抽取一个元素,完美匹配你要的概率比例:
import random # 权重对应:common5次、uncommon15次、rare25次、omg100次,总145次 rarity_pool = ['common'] * 5 + ['uncommon'] * 15 + ['rare'] * 25 + ['omg'] * 100 rarity = random.choice(rarity_pool) print(f"遭遇稀有度为 *{rarity}* 的怪物!")
内容的提问来源于stack exchange,提问作者Beef
相关产品推荐
相关产品推荐

