1、基础教育精品课3.2.5模块圆周率的计算(第一课时)年年 级级:一年级:一年级 学学 科科:信息技术(浙教版):信息技术(浙教版)1 理解模块的功能及应用。理解应用模块封装函数和常数的思想3 掌握模块中常数和函数的使用 掌握通过自定义函数,模块中的常数和函数编写程序解决实际问题学习目标2 掌握模块的导入方法 理解模块的功能及应用,掌握模块的导入方法。“圆周率”即圆的周长与其直径之间的比率。关于它的计算问题,历来是中外数学家极感兴趣、孜孜以求的问题。德国的一位数学家曾经说过:“历史上一个国家所算得的圆周率的准确程度,可以作为衡量这个国家当时数学发展的一个标志。”我国古代在圆周率的计算方面长期领先
2、于世界水平,这应当归功于魏晋时期数学家刘徽所创立的新方法“割圆术”。情境导入 20 世纪 70 年代之前所有计算机都是采用古典公式来计算pi 的,通常是 Machin 公式的变种。到了 1976 年,Salamin 和 Richard Brent 独立发现了一个新的计算p 的算法。这个算法收敛到pi 的速度比任何古典公式都要快得多,该算法只需二十五次迭代就足以将p 计算到超过四千五百万十进制位的精度。尽管靠着计算机的帮助,人类似乎已经把pi 的位数计算到了不可逾越的精度。但是所有这些算法都有一个共同的特点:为了计算pi 的第 d 位,将不得不首先计算出 d 位之前的所有位,当一个能够直接计算出
3、p 的第 d 位的全新公式被发现的时候,带给人们的绝不是一个小小的惊喜。这个公式,被称为 Bailey-Borwein-Plouffe 公式,简称为 BBP 公式,相应的算法,被称为 BBP 算法。摘自Rockins Chen UESTC,Chengdu 4/6/2009圆周率 pi 的 BBP 计算公式之详细证明问题分析 问题分析计算圆周率计算圆周率的原理:的原理:一个正方形内部相切一个圆,圆和正方形的面积之比是/4。在这个正方形内部,随机产生n个点(这些点服从均匀分布),计算它们与中心点的距离是否大于圆的半径,以此判断是否落在圆的内部。统计圆内的点数,与n的比值乘以4,就是的值。理论上,n
4、越大,计算的值越准。蒙特卡洛(蒙特卡洛(Monte Carlo)方法:)方法:蒙特卡洛是一个地名,位于赌城摩纳哥,象征概率。蒙特卡洛(Monte Carlo)方法是由大名鼎鼎的数学家冯诺伊曼提出的,诞生于上世纪40年代美国的“曼哈顿计划”。原理是通过大量随机样本,去了解一个系统,进而得到所要计算的值。探究任务一:利用BBP公式求解模块的讲解 电工常用的工具:螺丝刀是一种用来拧转螺丝以使其就位的工具。老虎钳用来起钉子或夹断钉子和铁丝,电能表的简称,是用来测量电能的仪表。电工使用的工具比较多,一般不会都拿在手里,不是每样工具每次都要使用到,电工把这些工具按照一定的分类放到不同的工具包中,需要的时候
5、才拿出某个工具使用。同样的,Python有很多的内建函数、常数,但是这些函数、常数不可能每次编程都用到,每次都加载这些函数、常数到当前的编程环境中是没有必要的,所以,我们也仿照电工的做法,把这些内建函数和常数放到工具包中,这些工具包在Python中称之为模块。模块的导入方法示例:import mathfrom math import sqrt import from import 第种方式可以用.或者.的方式来调用函数名或常数。比如:math.sqrt(9)#结果:3.0math.pi#结果:3.141592653589793第种方式可以直接用或者的方式来调用函数名或常数。比如:sqrt(9)
6、#结果:3.0 pi#结果:3.141592653589793 利用BBP公式求解编程实现注意:注意:pow()是()是math模块中的模块中的函数之一,使用它我们需函数之一,使用它我们需要导入要导入math库库可以实现多条语句的之可以实现多条语句的之间的连接,如果所写代码间的连接,如果所写代码过长,可以使用它进行多过长,可以使用它进行多行书写行书写from math import powpi=0N=100for k in range(N):pi+=1/pow(16,k)*(4/(8*k+1)-2/(8*k+4)-1/(8*k+5)-1/(8*k+6)print(圆周率值是:.format(p
7、i)from random import randomfrom time import perf_counterDARTS=1000*1000hits=0.0start=perf_counter()for i in range(1,DARTS+1):x,y=random(),random()dist=pow(x*2+y*2,0.5)if dist=1.0:hits=hits+1pi=4*(hits/DARTS)print(圆周率值是:.format(pi)print(运行时间是:.5fs.format(perf_counter()-start)探究二:蒙特卡洛(Monte Carlo)方法:r
8、andom()函数可以生成从0到1的随机数time.perf_counter()返回性能计数器的值(以分秒为单位),即具有最高可用分辨率的时钟,以测量短持续时间。说白了就是计时器,从函数被调用起到结束所用时间 random模块中的常用函数学习任务合唱比赛出场顺序安排 高一年级的(2)班、(3)班、(5)班、(8)班、(9)班共5个班级的学生参加大合唱比赛,为了公平起见,需要安排他们的出场顺序。请同学们至少提供两种不同的方法来解决该问题。名称名称含义含义random.random()生成一个0,1)范围内的实数random.unform(a,b)随机生成一个a,b范围内的实数random.ran
9、dint(a,b)随机生成一个a,b范围内的整数random.choice(seq)从序列的元素中随机挑选一个元素,比如random.choice(range(10),从0到9中随机挑选一个整数。random.sample(seq,k)从序列中随机挑选k个元素random.shuffle(seq)将序列的所有元素随机排序 随机排列问题的程序实现1 random模块中的函数shuffle接受一个列表作为输入参数,该函数将该列表中的所有元素重新随机排序,然后再将所有元素重新随机排序后的列表作为函数值返回。可以构建一个列表cla=(2)班,(3)班,(5)班,(8)班,(9)班,然后直接使用shuf
10、fle函数得到cla所有元素随机排序的列表。import randomcla=(2)班,(3)班,(5)班,(8)班,(9)班random.shuffle(cla)for x in cla:print(x)随机排列问题的程序实现2 先构建一个班级的列表cla=(2)班,(3)班,(5)班,(8)班,(9)班,在列表cla中每个班级都对应一个唯一的索引,索引的范围为0,4,可以使用random模块的randint函数随机生成5个不重复的整数,生成的整数范围为0,4,生成的不重复的整数就是cla随机的索引,通过随机的索引就能得到随机班级的出场顺序。import randomcla=(2)班,(3)
11、班,(5)班,(8)班,(9)班indexs=while len(indexs)5:i=random.randint(0,4)if i not in indexs:indexs.append(i)for i in indexs:print(clai)随机排列问题的程序实现3 构建一个班级的列表cla=(2)班,(3)班,(5)班,(8)班,(9)班,从这个列表cla中随机的拿出一个元素,放到列表cla2中,重复这个过程直到cla中的元素都被放到cla2中,cla2就是随机班级的出场顺序。import randomcla=(2)班,(3)班,(5)班,(8)班,(9)班cla2=for i in range(1,5):p=random.choice(cla)cla.remove(p)cla2.append(p)cla2.append(cla0)for x in cla2:print(x)总结归纳 模块封装函数和常数的思想 模块的导入方法探究1:圆周率的求解math库的使用random库的使用探究2:随机问题的排序