- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第三层设计(续) 函数gameOver def gameOver(a,b): # a and b represent scores for a racquetball game # RETURNS true if the game is over, false otherwise. return a==15 or b==15 函数printSummary def printSummary(winsA, winsB): # Prints a summary of wins for each player. n = winsA + winsB print \nGames simulated:, n print Wins for A: %d (%0.1f%%) % (winsA, float(winsA)/n*100) print Wins for B: %d (%0.1f%%) % (winsB, float(winsB)/n*100) 完整程序:rball.py 运行之,看看技术的小差距是否导致大胜负差? 试一试:修改成模拟多局制比赛. 设计的艺术 螺旋式开发与自顶向下设计是互补的方法. 如:原型可使用自顶向下设计 好的软件设计者会使用多种设计技术. 通过实践学习软件设计. Lu Chaojun, SJTU Lu Chaojun, SJTU 模拟与设计 Lu Chaojun, SJTU * Lu Chaojun, SJTU * * 模拟 我们目前掌握的工具已经足以解决一些有意思的问题. 有意思是指:如果不设计实现计算机算法,该问题是很难或不可能解决的. 模拟:用计算机为实际问题建模,从而提供非如此不能获得的信息. 这是解决实际问题的强大技术,每天都在应用: 天气预报 设计飞机 制作电影特效 ...... 一个模拟问题:Racquetball 球员的困惑:为什么球技只比对手略差,却输掉绝大多数的比赛? 一种可能是心理上的:你头脑中自以为比对手只是略差,实际情况是你差很多. 另一种可能:这是壁球运动本身的特性,能力上的细微差距却导致压倒性的胜负. 解决困惑:编程模拟壁球,通过模拟不同水平球员之间的数千场比赛来发现原因. Lu Chaojun, SJTU * Lu Chaojun, SJTU * Lu Chaojun, SJTU * 美式壁球基本知识 球,球拍,场地 一人发球开始比赛 然后两人交替击球(称为一个rally) 当一人未能击出合法球,则输掉本rally; 发球方输则交换发球权; 发球方赢则得1分. 先得15分者赢1局. Lu Chaojun, SJTU 程序规格说明 球技水平:用球员作为发球方时的获胜概率来模拟. 程序规格说明 输入:两个球员的水平,模拟比赛局数. 输出:两球员各自的获胜局数及比例. Lu Chaojun, SJTU * 随机数 模拟的是不确定性事件:每回合输赢是随机的. 这类模拟也称为Monte Carlo算法 如何用确定性的计算机模拟非确定性? 用函数生成随机数(实际上是伪随机数). 从种子值开始,计算出一个“随机”数; 如果还需要,就用上一个随机数反馈给生成函数,生成下一个随机数. Python库random提供了一些伪随机数生成函数: randrange():生成指定范围内的一个整数 random():生成[0,1)间的一个浮点数 Lu Chaojun, SJTU * 用random模拟输赢 设发球人获胜概率是prob 程序中显然需要这样的代码: if 发球者胜了本回合: score = score + 1 并且要使该条件为真的情况占prob 用random函数模拟: if random() prob: score = score + 1 Lu Chaojun, SJTU * prob 1– prob prob 1 0 自顶向下设计 对复杂问题常采用自顶向下设计: 将对一般问题的解决方案用若干个较小问题来表达. 再对较小问题用同样的方法分解. 直至小问题很容易求解. 将所有小问题的解合并,就得到大问题的解. Lu Chaojun, SJTU * 顶层设计 基本算法: 介绍程序功能 取得输入: probA, probB, n 利用probA和probB模拟n局比赛 输出结果报告 基本程序 def main(): printIntro() probA, probB, n = getInputs() winsA, winsB = simNGames(n, probA, probB) printSummary(winsA, winsB) Lu Chaojun, SJTU * 分离关注 Separ
文档评论(0)