Python在多次调用函数时给出相同的结果,尽管是随机组件

Python在多次调用函数时给出相同的结果,尽管是随机组件,python,memory,random,simulation,Python,Memory,Random,Simulation,我正在写一个棒球比赛模拟。我希望能够运行多场比赛,看看不同的打击率如何影响结果。每场比赛都是由“击球”组成的,其结果来自一个随机数 问题是当我运行多个游戏时,每一个游戏的结果都是一样的 我想象Python正在记住函数的结果,并且正在使用它。我是Python/CS新手,因此一直在尝试查找内存等问题,但没有找到我需要的答案。我感谢任何对资源的帮助或指导,我将不胜感激。多谢各位 以下是一个简化版本,以帮助我解释这个问题。它只使用安打和出局,以27出局结束比赛。最后,它循环了五场比赛 import

我正在写一个棒球比赛模拟。我希望能够运行多场比赛,看看不同的打击率如何影响结果。每场比赛都是由“击球”组成的,其结果来自一个随机数

问题是当我运行多个游戏时,每一个游戏的结果都是一样的

我想象Python正在记住函数的结果,并且正在使用它。我是Python/CS新手,因此一直在尝试查找内存等问题,但没有找到我需要的答案。我感谢任何对资源的帮助或指导,我将不胜感激。多谢各位

以下是一个简化版本,以帮助我解释这个问题。它只使用安打和出局,以27出局结束比赛。最后,它循环了五场比赛

  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()的末尾,输出
,首先不要忘记将参数添加到函数中