You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

问题分析

  1. 循环逻辑错误:遍历rolls时,i是字典的键(如'common'),不是对应数值列表,拿字符串和随机整数比较永远不会匹配。
  2. 没必要用列表存区间:把数值范围转成列表既浪费内存,也增加判断复杂度。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 00:31:03