雷欧库珀 发表于 2021-3-5 20:19

关于慕课python的一段代码问题

本帖最后由 雷欧库珀 于 2021-3-5 20:19 编辑

https://www.icourse163.org/learn ... 3449#/learn/content
第八周的实例13,老师的代码直接复杂粘贴运行结果和视频一样,但是如果换成我自己敲的,却很不一样。

老师的代码
# MatchAnalysis.py
from random import random


def printIntro():
    print("这个程序模拟两个选手A和B的某种竞技比赛")
    print("程序运行需要A和B的能力值(以0到1之间的小数表示)")


def getInputs():
    a = eval(input("请输入选手A的能力值(0-1): "))
    b = eval(input("请输入选手B的能力值(0-1): "))
    n = eval(input("模拟比赛的场次: "))
    return a, b, n


def simNGames(n, probA, probB):
    winsA, winsB = 0, 0
    for i in range(n):
      scoreA, scoreB = simOneGame(probA, probB)
      if scoreA > scoreB:
            winsA += 1
      else:
            winsB += 1
    return winsA, winsB


def gameOver(a, b):
    return a == 15 or b == 15


def simOneGame(probA, probB):
    scoreA, scoreB = 0, 0
    serving = "A"
    while not gameOver(scoreA, scoreB):
      if serving == "A":
            if random() < probA:
                scoreA += 1
            else:
                serving = "B"
      else:
            if random() < probB:
                scoreB += 1
            else:
                serving = "A"
    return scoreA, scoreB


def printSummary(winsA, winsB):
    n = winsA + winsB
    print("竞技分析开始,共模拟{}场比赛".format(n))
    print("选手A获胜{}场比赛,占比{:0.1%}".format(winsA, winsA / n))
    print("选手B获胜{}场比赛,占比{:0.1%}".format(winsB, winsB / n))


def main():
    printIntro()
    probA, probB, n = getInputs()
    winsA, winsB = simNGames(n, probA, probB)
    printSummary(winsA, winsB)


main()

老师的直接运行结果

我的代码
from random import random


def printIntro():
    print("这个程序模拟两个选手A和B的某种竟技比赛")
    print("程序运行需要A和B的能力值(以0到1之间的小数表示)")


def getInputs():
    a = eval(input("请输入选手A的能力值(0-1): "))
    b = eval(input("请输入选手b的能力值(0-1): "))
    n = eval((input("模拟比赛场次: ")))
    return a, b, n


def simNGames(n, probA, probB):
    winsA, winsB = 0, 0
    for i in range(n):
      scoreA, scoreB = simOneGame(probA, probB)
      if scoreA > scoreB:
            winsA += 1
    else:
      winsB += 1
    return winsA, winsB


def gameOver(a, b):
    return a == 15 or b == 15


def simOneGame(probA, probB):
    scoreA, scoreB = 0, 0
    serving = "A"
    while not gameOver(scoreA, scoreB):
      if serving == "A":
            if random() < probA:
                scoreA += 1
            else:
                serving = "B"
      else:
            if random() < probB:
                scoreB += 1
            else:
                serving = "A"
    return scoreA, scoreB


def printSummary(winsA, winsB):
    n = winsA + winsB
    print("竞技分析开始,共模拟{}场比赛".format(n))
    print("选手A获胜{}场比赛,占比{:0.1%}".format(winsA, winsA / n))
    print("选手B获胜{}场比赛,占比{:0.1%}".format(winsB, winsB / n))


def main():
    printIntro()
    probA, probB, n = getInputs()
    winsA, winsB = simNGames(n, probA, probB)
    printSummary(winsA, winsB)


main()

这是我的结果

这是两个文件链接
https://wws.lanzouj.com/ib3fLmjvkpc




雷欧库珀 发表于 2021-3-5 20:20

难道是随机数种子的原因嘛?

离人心上秋意浓 发表于 2021-3-5 20:25

丢代码编辑器里面对比下哪里有差异就大概知道了。

llyy390 发表于 2021-3-5 20:40

      if scoreA > scoreB:
            winsA += 1
    else:
      winsB += 1

这块缩进有问题! 修改缩进就Ok了。:Dweeqw

左手MJ 发表于 2021-3-5 20:49

红色部分,左边是老师的代码,右边的是你写的

左手MJ 发表于 2021-3-5 20:50

左手MJ 发表于 2021-3-5 20:49
红色部分,左边是老师的代码,右边的是你写的

楼上说的缩进位置也是不一样

Cool_Breeze 发表于 2021-3-5 21:03

def simNGames(n, probA, probB):
    winsA, winsB = 0, 0
    for i in range(n):
      scoreA, scoreB = simOneGame(probA, probB)
      if scoreA > scoreB:
            winsA += 1
      else: #缩进对齐if
            winsB += 1
    return winsA, winsB

fanvalen 发表于 2021-3-5 21:12

    a = eval(input("请输入选手A的能力值(0-1): "))
    b = eval(input("请输入选手b的能力值(0-1): "))
    n = eval((input("模拟比赛场次: ")))


检查这三句
括号大小不一
下面还多了一重括号

fanvalen 发表于 2021-3-5 21:16

fanvalen 发表于 2021-3-5 21:12
    a = eval(input("请输入选手A的能力值(0-1): "))
    b = eval(input("请 ...

对还有缩进 空格不一建议按tab来

雷欧库珀 发表于 2021-3-6 21:44

左手MJ 发表于 2021-3-5 20:49
红色部分,左边是老师的代码,右边的是你写的

这个对比差异怎么弄,在pycharm里
页: [1] 2
查看完整版本: 关于慕课python的一段代码问题