random.randint函数不按我想要的方式工作

时间:2013-09-15 03:46:09

标签: python list python-2.7 python-3.x

每当我运行这个程序(不是一个严肃的程序只是搞乱了解事物)时,monster (monster[1])的损坏只是一遍又一遍地重复相同的数字。它随机化一次,然后重复它。我明白发生了什么,但我不明白为什么会这样。这是代码(对不起,我不知道我是否明白我的问题是否清楚......在我的脑海中有意义大声笑)

编辑 - 我希望怪物[1]函数每次都能随机化,但我不知道怎么做而不编写更多代码(即damage=random.randint(5, 15) health-=damage)。如果我这样写它就可以了。但如果我有一系列10个不同的怪物,我不想特别写。我想只是召唤每个怪物并让它自己运行,如果这是有道理的。

编辑#2:是否有可能在列表中创建元组,因为元组是不可变的(即monster=[100, (random.randint(5, 15)), random.randint(15, 30)]此代码不起作用我已经尝试过但只是想知道它是否可行。< / p>
import random
monster = [100, random.randint(5, 15), random.randint(15, 30)]
health = 200
a = 1

print "you run into a monster"
while a == 1:
    if monster[0] <= 0:
        print "monster is dead"
        print "you get, " + str(monster[1]) + " exp"
        a += 1
    elif monster[0] >= 0:
        att = random.randint(5, 15)
        monster[0] -= att
        health -= monster[1]
        print ("you attack the monster and do, " + str(att) + " damage"
               " the monster does," + str(monster[1]) + " damage to you")
        print "you have, " + str(health) + " health left"
        print "monster has, " + str(monster[0]) + " health left"

5 个答案:

答案 0 :(得分:2)

monster[1]在代码的第二行分配一个随机整数。然后它作为整数存储在列表monster中。那个整数将保持不变。您必须重新运行random.randint(5, 15)电话才能获得新的“损害”号码或新的预付金额。

虽然我认为它可能超出了你在这里工作的范围,你可能想要研究创建一个class怪物而不是使用一个数组,然后有一个生成这些随机整数的方法每次攻击。

这是一个示例怪物类,可以让您了解它是如何工作的。

class monster():
    def __init__(self,health):
        self.health = health

    def attack(self):
        return random.randint(5,15)

然后您可以按如下方式创建一个新怪物。

monster = monster(100)

查看它造成的伤害程度如下。

monsterDamage = monster.attack()
health -= monsterDamage
print "The monster does " + str(monsterDamage) + " damage to you."

如下所示降低怪物的健康状况。

att = random.randint(5,15)
monster.health -= att

答案 1 :(得分:1)

这一行:

monster=[100,random.randint(5, 15), random.randint(15, 30)]

保存100和两个随机数一次。例如,这可能是monster在运行时的表示:

monster=[100, 11, 26]

这些数字不会改变,因为作业只发生一次。 (例如,在循环之外)

答案 2 :(得分:1)

monster=[100,random.randint(5, 15), random.randint(15, 30)]

定义此列表时,它将始终相同。每次执行monster[1]时,这些值都不会改变。

要解决此问题,您可以执行以下操作:

monster=[100, random.randint, random.randint]

当你去打电话时:

monster[1](15, 15)

只是一个选择。虽然字典在这里可能更好。

答案 3 :(得分:1)

嗯,你只给了monster[1]一个值,在第二行:

monster=[100,random.randint(5, 15), random.randint(15, 30)]

该行只执行一次,因此“当然”monster[1]始终是相同的。如果您想要更改monster[1](和/或monster[2]),则需要在循环中为其设置新值 。你为att做了那个!您需要为所有其他想要改变的事情做类似的事情: - )

答案 4 :(得分:0)

当你拨打电话时:

monster = [100, random.randint(5, 15), ...]

执行random.randint(5,15)函数,并将特定值存储在列表中。

通过将函数存储为字符串,我将提供另外一种替代方法来做你想做的事情;你可以写:

monster = [100, "random.randint(5, 15)", ...]

然后当你想得到一个新的随机整数时,你打电话:

r=eval(monster[1])

并且每次调用它时都会给出一个不同的整数,因为该函数会被重新评估。

(请注意,如果要重新使用随机值,例如打印它,则必须将其存储在临时变量“r”中,然后使用str(r)而不是str(eval( monster [1])),因为前一种方式打印存储在“r”中的调用结果,后一种方式再次重新评估该函数。)

例如

    tmp = eval(monster[1])
    health -= tmp
    print ("you attack the monster and do, " + str(att) + " damage. the monster does," + str(tmp) + " damage to you")