Python游戏物品随机值生成问题:重复选同一物品值不变
问题解决:每次选择物品生成新的随机属性值
问题原因
你当前的代码中,itemvariable列表在定义时就立即执行了r()函数,把生成的随机数值直接存在了列表里。这些值是固定的,后续每次调用random.choice(itemvariable)只是取出这些预先生成好的固定值,不会重新计算随机数,所以重复选同一物品时数值不变。
解决方案
要实现每次选择物品时生成新的随机值,需要让随机数的生成延迟到选择物品之后。这里提供两种简洁的实现方式:
方式1:用lambda表达式延迟计算
把itemvariable里的元素改为lambda函数,每次选择后调用该函数生成新值:
import random def r(start, end): return random.randint(start * 10, end * 10) / 10 itemname = ['name1','name2','name3','name4','name5'] # 存储lambda函数,而非直接生成的数值 itemvariable = [lambda: r(1,2), lambda: r(1,3), lambda: r(3,5), lambda: r(1,6), lambda: r(6,7)] # 选择后调用lambda函数生成新值 for _ in range(3): selected_name = random.choice(itemname) selected_var_func = random.choice(itemvariable) print(selected_name, selected_var_func())
方式2:绑定物品与属性参数(更易维护)
把物品名称和对应的随机区间参数存为元组,选择时根据参数调用r()生成新值,这种方式更直观,后续修改属性区间也更方便:
import random def r(start, end): return random.randint(start * 10, end * 10) / 10 # 每个元素是(物品名, 起始值, 结束值)的元组 items = [ ('name1', 1, 2), ('name2', 1, 3), ('name3', 3, 5), ('name4', 1, 6), ('name5', 6, 7) ] for _ in range(3): selected_item = random.choice(items) name, start, end = selected_item print(name, r(start, end))
效果验证
运行修改后的代码,即使重复选中同一个物品,每次输出的随机值都会不同,符合你的期望。
内容的提问来源于stack exchange,提问作者Toshiro
相关产品推荐
相关产品推荐

