9.4 练习
1. 利用 random 或 randrange 函数来实现下列计算任务。
(1)表示打靶所得环数(0~10 环)的整型随机数;
(2)区间[-0.5,0.5]内的浮点型随机数;
(3)表示投掷一个骰子所得结果的随机数;
(4)表示投掷两个骰子所得结果的随机数。
2. 修改程序 9.2,以 A、B 两球员各自的发球得分概率表示技术水平,并将发球、换发球添 加到程序中。
3. 设计并实现模拟排球比赛的程序,以研究只有发球方才能得分的老规则与每回合得分的 新规则对胜负是否有影响。如果有,新规则有利于强队还是弱队。
4. 编程模拟骰子游戏:玩家首先投掷两个骰子,如果掷出的是 2、3 或 12 点,则玩家输;
如果掷出的是 7 或 11 点,则玩家赢;如果是其他点数(设为 p 点),则继续投掷,一直到掷 出 7 点或者再次掷出 p 点为止,掷出 7 点则玩家输,再次掷出 p 点则玩家赢。模拟多局,并 估算玩家的获胜概率。
5. 蒙特卡洛技术可用于估计p的值。假设有一块圆形飞镖板,正好嵌在一个正方形橱柜里。 现在来随机投掷飞镖,命中飞镖板的次数与命中橱柜(即飞镖板没有覆盖的四个角落)的次 数之比,是由飞镖板与橱柜面积决定的。设 n 是总的投掷次数(落在橱柜范围内),h 是命 中飞镖板的次数,则p≈4h/n。编程模拟飞镖游戏,输入 n,输出p的估计值。提示:如果正 方形以原点为中心且大小为 2x2,则可以用 2*random() - 1 来生成落在正方形中的随机点的 x 和 y 坐标。如果 x2+y2≤1,则该点落在飞镖板内部。
6. 编程模拟一手掷 5 个骰子,估计 5 个骰子点数全部相同的概率。
7. 模拟一维随机漫步(random walk):在一条很长的笔直马路上漫步,步行方向由掷硬币决 定。即如果掷出正面,则向前走一步;否则向后走一步。记录走 n 步后离出发点的距离 d。 重复多次试验,看看 d 的平均值等于多少。
8. 模拟二维随机漫步:在一个平面上,每次随机向前、向后、向左或向右走一步。如果走 n步,离出发点距离 d 是多少?需要重复多次求得 d 的平均值。
9. 修改第 8 题,改成每一步允许向任何方向迈步。提示:利用 angle = random() * 2p随机生 成一个方向角(前进方向与 x 轴的夹角),走到由 x = x + cos(angle)和 y = y + sin(angle)决定 的位置。作图显示漫游轨迹。
10. 编写一个程序,其中创建 2 个线程,一个线程用来计算 2~10000000 之间的素数个数, 另一个线程用来计算 10000000~20000000 之间的素数个数。哪个范围内的素数多?