模拟法课题:模拟法目标:知识目标:模拟的的实现能力目标:模拟的实现重点:模拟的实现难点:模拟的实现板书示意:1)模拟的引入(例31)2)模拟的应用(例32)授课过程:有些问题很难建立枚举、递归等算法,甚至建立不了数学模型,但可以根据问题的描述,用程序模拟某种现象或规律,从而跟踪出结果
根据模拟对象的不同特点,可以把计算机模拟分为决定型模拟和随机行模拟两大类
决定型模拟是对决定性现象进行的模拟,其所模拟的事件按照固有则规律发生发展,并且最终有明确的结果
在这种题目中,由于数学模型中各种参数的变化多半是有规律的所以算法设计一般不是很困难
随机模拟是模拟随机现象,由于随机现象中至少有一个不确定的因素,因此在模拟中,必须建立一个用随机值来模拟事件的进程,在随机模拟过程中,通过修改变问题的各种参数,进而观察变更这些参数所引起的状态变化
一般情况是,题目给出某一概率,设计者利用随机函数去设定在某一范围的随机值,将符合概率的随机值作为参数
然后根据这一模拟模型展开算法设计
随机模拟的关键是在概率已知的条件下,如何确定随机值产生的范围
这个随机值设计得好,模拟效果就好
本节仅讨论决定性模拟问题
有关随机模拟的问题,大家可以参考一些相关书籍
例31:约瑟夫问题N个人排成一个圆圈,然后把这N个人按逆时针方向分别编号为1、2、……、N
从编号为1的人开始按逆时针计数,当某人计数为M的倍数是,该人出圈;如此循环下去,直到圈中只有一个人留下
分析:这道题似乎用不上什么算法,只需建立一个循环链表,然后按照题目中要求的模拟即可
算法描述如下:forI:=1toNDOP[I]:=I+1;{建立循环链表}P[N]:=1;Now:=N;repeat{模拟出圈过程}Now:=N;forI:=1toM-1doNow:=P[Now];{模拟报数}P[Now]:=P[Now[Now]];{编号为P[Now]的人出圈}