函数测试

这里以体育竞技模拟程序内涵数为例

原完整代码

 1 # -*- coding: utf-8 -*-
 2 """
 3 Created on Wed May 15 11:38:02 2019
 4
 5 @author: lenovo
 6 """
 7
 8 import random
 9 import math
10 def printIntro():
11     print("这个程序模拟量个选手A和B的乒乓球比赛")
12     print("程序运行需要A和B的能力值(以0到1之间的小数表示)")
13     print("作者:呆。   (02)")
14 def getInputs():
15     a = eval(input("请输入选手A的能力值(0-1): "))
16     b = eval(input("请输入选手B的能力值(0-1): "))
17     n = eval(input("模拟比赛的场次: "))
18     return a, b, n
19
20 def printSummary(winsA, winsB):
21     n = winsA + winsB
22     print("竞技分析开始, 共模拟{}场比赛".format(n))
23     print("选手A获胜{}场比赛, 占比{:0.1%}".format(winsA, winsA/n))
24     print("选手B获胜{}场比赛, 占比{:0.1%}".format(winsB, winsB/n))
25
26 def gameOver(a, b):
27     return (a==11 and b<10) or (b==11 and a<10) or (a>=10 and b>=10 and math.fabs(a-b)==2)
28
29 def simoneGame(probA, probB):
30     scoreA, scoreB = 0, 0
31     if random.random() < 0.5:
32         serving = "A"
33     else :
34         serving = "B"
35     while not gameOver(scoreA, scoreB):
36         if serving == "A":
37             if random.random() < probA:
38                 scoreA += 1
39             else:
40                 serving = "B"
41         else:
42             if random.random() < probB:
43                 scoreB += 1
44             else:
45                 serving = "A"
46     return scoreA, scoreB
47 def simOneGame(probA, probB):
48     winsA, winsB = 0, 0
49     for i in range(7):
50         scoreA, scoreB = simoneGame(probA, probB)
51         if scoreA > scoreB:
52             winsA += 1
53         else:
54             winsB += 1
55     return winsA, winsB
56 def simNGames(n ,probA, probB):
57     winsA, winsB = 0, 0
58     for i in range(n):
59         scoreA, scoreB = simOneGame(probA, probB)
60         if scoreA > scoreB:
61             winsA += 1
62         else:
63             winsB += 1
64     return winsA, winsB
65
66 def main():
67     printIntro()
68     probA, probB, n = getInputs()
69     winsA, winsB = simNGames(n, probA, probB)
70     printSummary(winsA, winsB)
71 main()

分离函数单独测试

首先测试最底层函数 gameOver(a, b)

import math
def gameOver(a, b):
    return (a==11 and b<10) or (b==11 and a<10) or (a>=10 and b>=10 and math.fabs(a-b)==2)
print(gameOver(9,11))
print(gameOver(11,7))
print(gameOver(13,11))
print(gameOver(11,11))
print(gameOver(10,11))

结果正常:

由于gameOver函数无误,故借用该函数测试函数simoneGame(probA, probB)

import random
import math
def gameOver(a, b):
    return (a==11 and b<10) or (b==11 and a<10) or (a>=10 and b>=10 and math.fabs(a-b)==2)

def simoneGame(probA, probB):
    scoreA, scoreB = 0, 0
    if random.random() < 0.5:
        serving = "A"
    else :
        serving = "B"
    while not gameOver(scoreA, scoreB):
        if serving == "A":
            if random.random() < probA:
                scoreA += 1
            else:
                serving = "B"
        else:
            if random.random() < probB:
                scoreB += 1
            else:
                serving = "A"
    return scoreA, scoreB
a,b=simoneGame(0.5, 0.5)
print(a)
print(b)

多次运行结果:

与期望相同

在借用上述函数测试函数simOneGame(probA, probB)

import random
import math
def gameOver(a, b):
    return (a==11 and b<10) or (b==11 and a<10) or (a>=10 and b>=10 and math.fabs(a-b)==2)

def simoneGame(probA, probB):
    scoreA, scoreB = 0, 0
    if random.random() < 0.5:
        serving = "A"
    else :
        serving = "B"
    while not gameOver(scoreA, scoreB):
        if serving == "A":
            if random.random() < probA:
                scoreA += 1
            else:
                serving = "B"
        else:
            if random.random() < probB:
                scoreB += 1
            else:
                serving = "A"
    return scoreA, scoreB
def simOneGame(probA, probB):
    winsA, winsB = 0, 0
    for i in range(7):
        scoreA, scoreB = simoneGame(probA, probB)
        if scoreA > scoreB:
            winsA += 1
        else:
            winsB += 1
    return winsA, winsB
a,b=simOneGame(0.5, 0.5)
print(a)
print(b)

结果如下:

竞技规则为7局4胜

故结果出错改动如下:

def simOneGame(probA, probB):
    winsA, winsB = 0, 0
    for i in range(7):
        scoreA, scoreB = simoneGame(probA, probB)
        if winsA==4 or winsB==4:
            continue
        elif scoreA > scoreB:
            winsA += 1
        else:
            winsB += 1
    return winsA, winsB

改动后结果正确

同理嵌套检测函数simNGames(n ,probA, probB)及main函数

过程:略

原文地址:https://www.cnblogs.com/DXL123/p/10909245.html

时间: 2024-11-10 14:09:30

函数测试的相关文章

I/O多路复用---epoll函数测试

参考文章来源: epoll使用详解(精髓) Epoll学习笔记 epoll是直到Linux2.6才出现了由内核直接支持的实现方法,那就是epoll,它几乎具备了之前所说的一切优点,被公认为Linux2.6下性能最好的多路I/O就绪通知方法. epoll可以同时支持水平触发和边缘触发(Edge Triggered,只告诉进程哪些文件描述符刚刚变为就绪状态,它只说一遍,如果我们没有采取行动,那么它将不会再次告知,这种方式称为边缘触发),理论上边缘触发的性能要更高一些,但是代码实现相当复杂. epol

经典笔试题:用C写一个函数测试当前机器大小端模式

“用C语言写一个函数测试当前机器的大小端模式”是一个经典的笔试题,如下使用两种方式进行解答: 1. 用union来测试机器的大小端 1 #include <stdio.h> 2 3 union test 4 { 5 int a; 6 char b; 7 }; 8 9 int endian_test(void) 10 { 11 union test t1; 12 t1.a = 1; 13 return t1.b; 14 } 15 16 int main(void) 17 { 18 int i =

【Python装饰者】在函数测试的作用

[引言] 我们经常需要多函数进行耗时测试,测试方法有许多,这里介绍装饰者的方法,提高耗时测试代码的可复用性,在其他方面的应用也是如此. [设计原则] 类应该对扩展开放,对修改关闭. [代码] (1)定义装饰者具体方法 #encoding: UTF-8 ''' Created on 2016??12??7?? @filename: test.py @author: YYH ''' import time from functools import wraps class TimeRecorder:

夺命雷公狗C/C++-----9---自定义一个函数测试简单的运算

温馨提示:c/c++中的变量在同一个作用域内不可以从名. 我们在成程序的时候最好将原理图给弄明白,不然很难写的,如下图所示: 在这个图像中我们可以很清新的看得到,test.cpp里面的main里面进行总的控制, test2.c自定义一个  add 的函数让他进行整型进行运算.. 首先我们在头文件创建一个test.h  我们在里面定义好我们的 int a  和 int  b  分别是多少,如下图所示: 然后我们写 写一个test.cpp,将结构搭建起来再说,如下所示: 然后我们开始写   test

transform 函数测试

#include <iostream> #include <vector> #include <set> #include <algorithm> using namespace std; // 自定义泛函数 template <class T> void PRINT_ELEMENTS(const T& coll, const char * str="") { typename T::const_iterator po

python自定义日志函数测试

#!/user/bin/python# -*- encoding: UTF-8 -*- import sys def logs(): print sys._getframe().f_code.co_name print sys._getframe().f_lineno print sys._getframe().f_back.f_code.co_name print sys._getframe().f_back.f_lineno def get_cur_info() : logs() get_c

JavaScript 缓存函数测试

! function () { var /* */_a = function (x) { ; x.forEach( function (v) { return v*v }) } , _b = function (x) { var _each = function (v) { return v*v } ; x.forEach( _each ) } , _c = ( function () { var _each = function (v) { return v*v } ; return func

栈的函数测试

#include<stdio.h> #include<stdlib.h> #define ok 1 #define error 0 #define overflow -2 typedef struct { int *base,*top; int stacksize; }sqstack; int initstack(sqstack *s) { s->base=(int *)malloc(10*sizeof(int)); //预先为s->base所指向的内存空间分配10个i

Perl文件测试操作和stat函数

在shell中通过test命令或者中括号[]可以进行文件测试以及其它类型的测试,例如判断文件是否存在,比较操作是否为真等等.perl作为更强大的文本处理语言,它也有文件测试类表达式,而且和shell的文件测试用的字母符号都类似. perl中测试文件的属性来源是perl的内置函数stat,它可以获得文件的13项属性.后文会介绍该函数. 测试符 测试符号都是短横线开头,加一个字母.例如,测试文件是否存在-e "a.log".在可能产生歧义的情况下,这些测试符可以用括号包围,例如:(-e &