Python在多次调用函数时给出相同的结果,尽管是随机组件
我正在写一个棒球比赛模拟。我希望能够运行多场比赛,看看不同的打击率如何影响结果。每场比赛都是由“击球”组成的,其结果来自一个随机数 问题是当我运行多个游戏时,每一个游戏的结果都是一样的 我想象Python正在记住函数的结果,并且正在使用它。我是Python/CS新手,因此一直在尝试查找内存等问题,但没有找到我需要的答案。我感谢任何对资源的帮助或指导,我将不胜感激。多谢各位 以下是一个简化版本,以帮助我解释这个问题。它只使用安打和出局,以27出局结束比赛。最后,它循环了五场比赛Python在多次调用函数时给出相同的结果,尽管是随机组件,python,memory,random,simulation,Python,Memory,Random,Simulation,我正在写一个棒球比赛模拟。我希望能够运行多场比赛,看看不同的打击率如何影响结果。每场比赛都是由“击球”组成的,其结果来自一个随机数 问题是当我运行多个游戏时,每一个游戏的结果都是一样的 我想象Python正在记住函数的结果,并且正在使用它。我是Python/CS新手,因此一直在尝试查找内存等问题,但没有找到我需要的答案。我感谢任何对资源的帮助或指导,我将不胜感激。多谢各位 以下是一个简化版本,以帮助我解释这个问题。它只使用安打和出局,以27出局结束比赛。最后,它循环了五场比赛 import
import random
hits = 0
outs = 0
# determine whether player (with .300 batting average) gets a hit or an out
def at_bat():
global hits
global outs
number = random.randint(0,1000)
if number < 300:
hits +=1
else:
outs += 1
# run at_bat until there are 27 outs
def game():
global hits
global outs
while outs < 27:
at_bat()
else:
print "game over!"
print hits
# run 5 games
for i in range(0,5):
game()
随机导入
点击率=0
出局=0
#确定球员(平均打击率为0.300)是命中还是出局
def at_bat():
全球点击率
全球出局
数字=random.randint(01000)
如果数量<300:
点击次数+=1
其他:
输出+=1
#快跑,直到有27人出局
def game():
全球点击率
全球出局
当输出小于27时:
at_bat()
其他:
打印“游戏结束!”
打印命中率
#跑5场比赛
对于范围(0,5)内的i:
游戏()
问题在于使用全局变量
在您的游戏()首次运行后,出局数为27。
当您再次调用游戏时,它仍然具有相同的值,因此您的while循环将立即退出。import random
import random
# determine whether player (with .300 batting average) gets a hit or an out
def game():
global hits
global outs
hits = 0
outs = 0
while outs < 27:
hits, outs = at_bat()
else:
print("game over!")
print(hits)
def at_bat():
global hits
global outs
number = random.randint(0,1000)
if number < 300:
hits += 1
else:
outs += 1
return hits, outs
# run 5 games
for i in range(0,5):
game()
#确定球员(平均打击率为0.300)是命中还是出局
def game():
全球点击率
全球出局
点击率=0
出局=0
当输出小于27时:
命中率,出局率=at_bat()
其他:
打印(“游戏结束!”)
打印(点击数)
def at_bat():
全球点击率
全球出局
数字=random.randint(01000)
如果数量<300:
点击次数+=1
其他:
输出+=1
回击、出局
#跑5场比赛
对于范围(0,5)内的i:
游戏()
我总是发现global有时会搞砸,但这段代码很有效,可以得到不同的数字<每次运行游戏代码时,代码>输出将始终为27,将其重置为0可确保每次运行游戏循环啊,全局变量 事实上,如果您为每个循环重置这两个全局变量,您的代码将运行良好。因此:
for i in range(0,5):
game()
hits = 0
outs = 0
值得指出的是,您所指的同一个值不是随机种子、生成器或诸如此类的东西,而是命中和出局的值。太棒了。这比一些模糊的记忆方法更有意义。非常感谢。非常感谢。是的,我不确定使用globals是否是最好的方法。但是谢谢你,这是一个很大的帮助。你可以同样轻松地使用参数将
hits
和outs
传递到at_bat()
并将它们返回到game()
调用函数,如hits,outs=at_bat()
,然后在at_bat()
中将其放在return hits()的末尾,输出
,首先不要忘记将参数添加到函数中