我对python很陌生,遇到了一个我不完全了解的问题。我试图让一个随机变量运行多次,但是由于某种原因,它只会返回相同的随机值x次。
除了已经完成的代码外,我还不确定要尝试什么。
lowTreasureList = "50 gold", "Healing Potion", "10x Magic Arrows", "+1 Magic Weapon"
def ranLowLoot(lowLootGiven):
# This function returns a random string from the passed list of strings.
lootIndex = random.randint(0, len(lowLootGiven) - 1)
return lowLootGiven[lootIndex]
lowLoot = ranLowLoot(lowTreasureList)
treasureSelection = int(input())
if treasureSelection == 1:
numLowTreasure = int(input('How many treasures? '))
for i in range(numLowTreasure):
ranLowLoot(lowTreasureList)
print(lowLoot)
当我这样做时,我得到相同的随机宝物(numLowTreasure)次,但是我试图每次选择一个新的随机宝物来获得它。
答案 0 :(得分:1)
问题在于,在主循环中,您正在丢弃调用ranLowLoot()
的结果。作为最小修复,在主循环中分配该函数调用的结果。使用:
lowLoot = ranLowLoot(lowTreasureList)
而不是简单地:
ranLowLoot(lowTreasureList)
作为更好的解决方案,请完全抛弃函数,而仅使用random.choice()
(这样做是您想做的,而不必大惊小怪):
import random
lowTreasureList = ["50 gold", "Healing Potion", "10x Magic Arrows", "+1 Magic Weapon"]
treasureSelection = int(input())
if treasureSelection == 1:
numLowTreasure = int(input('How many treasures? '))
for i in range(numLowTreasure):
lowLoot = random.choice(lowTreasureList)
print(lowLoot)
答案 1 :(得分:1)
如果还没有的话,这将有助于阅读the random
module上的文档。
random.randint有三种更适合您目的的替代方法:
random.randrange(start, stop, [step])
:步骤是可选的,默认为1。这将为您节省用于获取lootIndex的len(...) - 1
,因为stop是互斥的。random.randrange(stop)
:使用默认的起始零和默认的步长1,这将节省您传递0
作为起始索引的作用。random.choice(seq)
:您可以将函数的参数lowLootGiven
作为seq
传递给它,这样可以避免使用索引和完全编写自己的函数。关于为什么您会得到重复的宝藏,这是因为您没有在for循环中更新变量lowLoot
。您应该写:
for i in range(numLowTreasure):
lowLoot = ranLowLoot(lowTreasureList)
print(lowLoot)
最后我想说的是python非常适合快速编写简单的东西。即使您在其中编写此代码的环境更大,我也可能是这样写的:
lowTreasureList = ("50 gold", "Healing Potion", "10x Magic Arrows", "+1 Magic Weapon")
if int(input()) == 1:
for i in range(int(input('How many treasures? '))):
print(random.choice(lowTreasureList))
在这种情况下,不必像以前那样在元组声明周围使用圆括号,但是我喜欢使用它,因为如果要使元组声明跨越多行,没有它们就无法使用。 / p>
阅读关于标准库的文档几乎总是对我有所帮助。我认为Python的文档很棒,并且如果它太早需要消化,我发现tutorialspoint是一个不错的起点。
与您的问题无关-但出于好奇,您是否首先学习另一种语言?