我有以下功能随机发出技能统计数据。它按照我的预期工作。
def randstat(level):
from random import randint
points = randint(10,max(20,5*level))
# set all our minimums to zero
stats = [0, 0, 0, 0, 0]
for i in range(1, points):
stat = randint(0, len(stats)-1); # pick a random stat to increment
stats[stat] += 1
# extract the stats back out of our array
agility = stats[0]
stamina = stats[1]
strength = stats[2]
vitality = stats[3]
intelligence = stats[4]
但是,我想使用我已有的其他功能将stat = randint(0, len(stats)-1);
简化为stat = randlist(stats)
:
def randlist(list):
from random import randint
return(list[randint(0,len(list)-1)])
这给了我一个错误: exeptions.indexError:列表索引超出范围 当我在另一个函数中几乎拥有完全相同的代码行时,为什么会这样做? 可能是一个非常简单的事情,我可以俯瞰。无论如何,提前谢谢。
答案 0 :(得分:0)
但是我想简化stat = randint(0,len(stats)-1);到stat = randlist(数据)
您可以使用random.choice
在方法中简化它。您的代码还存在一些其他问题,这是一个改进版本,它使用字典作为统计信息:
import random
def randstat(level):
points = random.randint(10,max(20,5*level))
stats = {'agility': 0,
'stamina': 0,
'strength': 0,
'vitality': 0,
'intelligence': 0}
for i in range(1, points):
stat = random.choice(stats.keys()) # pick a random stat to increment
stats[stat] += 1
return stats
答案 1 :(得分:0)
您在randlist
函数中有一个额外的查找,并且您最终尝试执行以下操作:
stats[stats[stat]] += 1
通过从list[]
中移除无关的randlist
来解决此问题,因此您只需返回随机索引(而不是值):
def randlist(list):
return randint(0, len(list)-1)
但是,请考虑使用与Burhan Khalid's answer中不同的数据结构。 Python最佳实践是尽可能避免索引算法 - 这样做往往会导致代码更容易阅读和维护,而且作为一个很好的奖励,它通常会更短。