当前位置:   article > 正文

MATLAB知识点:循环语句的经典练习题_matlab练习

matlab练习

 ​讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​

MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili


节选自​第4章:MATLAB程序流程控制

下面我们来看几道典型例题。

(1)质数(Prime number),又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个正因数的数)。给定任意一个大于100的自然数n(例如n=135389),请判断n是否为质数。

思路:我们可以遍历从2到n-1的所有整数,检查它们是否能够整除n。如果找到任何一个能够整除n的整数,那么n就不是质数;否则,n就是质数。

  1. n = 135389; %要判断的数n
  2. is_prime = true; % 初始化标志变量is_prime为true,此时代表n是质数
  3. for ii = 2:n-1 % 思考:如何缩小循环遍历的范围来提高代码运行的效率,留作本章课后习题
  4. % 检查ii是否能够整除n
  5. if mod(n, ii) == 0
  6. % 如果能整除,则n不是质数,将标志变量is_prime重新赋值为false
  7. is_prime = false;
  8. break; % 跳出循环
  9. end
  10. end
  11. disp(is_prime)

(2)一副扑克牌有54张牌(桃杏梅方四种花色的A 2 3 4 5 6 7 8 9 10 J Q K加双王),假设三名玩家玩斗地主,其中地主有20张牌,两个农民各17张牌。若你是其中一名玩家,且你每次都选择当农民。,请编程模拟以下场景:先玩第一把,若这把手上有炸弹则这把玩完后下场换其他人玩;若手上没有炸弹则继续玩第二把,直到玩到第k把时手上有炸弹,此时玩完这一把后下场换其他人玩。请输出你模拟的k。注意:假设每把牌都洗的足够的混乱,确保为无序;有炸弹是指手上有双王或者有四张相同的牌例如4张3。(这里的k表示你作为农民首次出现炸弹的轮数,由于发牌过程是随机的,那么k肯定也是一个随机的变量,即每次模拟的k可能都不相同。比如运气好可能第一把就出现了炸弹,此时k等于1,运气不好可能需要好多把才会出现炸弹,此时k较大)。

思路:由于循环的次数不定,因此我们可以使用while循环来不断模拟游戏的进行,直到满足退出的条件。在每一轮中,我们作为农民会随机抽取17张牌,并检查是否有双王或者普通的炸弹。如果有任何一种炸弹,就会退出循环,否则会增加游戏的轮数,继续下一轮。最后,我们可以输出模拟的k值,表示玩到第k把时手上有炸弹。

  1. % 用113分别代替A 2 3 ... J Q K, 重复4次表示四种花色;用1415分别代表大小王
  2. poke = [repmat(1:13,1,4),14,15]; % 生成一副扑克牌
  3. k = 1; % 玩了多少把游戏
  4. while 1
  5. % 从1:54中随机抽取17个数,表示17张牌对应的下标
  6. idx = randperm(54,17); % randperm函数的用法:《第3章:课后习题讲解中拓展的函数》
  7. % 发牌并排序(排序后牌面看起来更清楚一点,事实上不排序也不影响下面的代码)
  8. p = sort(poke(idx));
  9. % 检查是否有大小王
  10. v1 = all(ismember([14,15],p)); % v1true表示有双王,为false表示没有双王
  11. % 检查是否有普通的炸弹
  12. v2 = false; % v2表示是否有普通的炸弹,先假设没有,因此初始化为false
  13. for ii = 1:13
  14. if sum(p == ii) == 4 % 如果有四张一样的牌
  15. v2 = true; % % 将v2赋值为ture,表示有普通的炸弹
  16. break % 只要有一个普通的炸弹就可以退出for循环了
  17. end
  18. end
  19. if v1 || v2 % 如果有王炸或者普通炸弹就可以退出while循环
  20. break % 跳出while循环
  21. else
  22. k = k + 1; % 没有炸弹就再玩一把
  23. end
  24. end
  25. disp(k) % 输出首次出现炸弹时玩的轮数

在本题中,既用到了while循环又用到了for循环,且出现了两个不同用途的break,大家课后一定要认真消化,并尝试自己求解这个例题(当然,判断是否存在普通的炸可以不用循环语句,我们在第三章的课后习题中有讲解,详情请看第三章课后习题挑战篇的Q5)。

MATLAB课程第3章课后习题讲解——数学建模清风老师_哔哩哔哩_bilibili

另外,本题还能继续扩展下去,例如重复上面的模拟过程N次(N可以设置得大一点,例如N等于10万),得到这N次模拟结果的k,并计算这N次k的平均值,这个平均值就能表示你作为农民首次出现炸弹所需的期望轮数。这个拓展的问题将留作本章最后的课后习题,我们下一道题也会介绍类似的思想。

(3)一只失明的小猫掉进山洞里,山洞有三个门,其中进入第一个门后走2h后可以回到地面,进入第二个门后走4h会回到原始的出发点,进入第三个门后走6h还是回到原始的出发点。假设小猫每次都随机地选择这三个门中的一个进入,求小猫走出山洞的期望时间?

思路:在上一章的课后习题中,我们见到过类似的题目,当时我们介绍过蒙特卡罗模拟这种方法,蒙特卡罗模拟将所求解的问题同一定的概率模型相联系,用计算机实现统计模拟或抽样来获得问题的近似解。我们可以模拟这个过程N次(N一般要设置的大一点,例如让N等于10万),每次模拟中我们都让一只猫走出山洞,并记录下这只猫所需的时间。接下来我们只需要对这N次模拟结果得到的时间计算平均值,就能估计小猫走出山洞的期望时间。

  1. N = 100000; % 设置模拟的次数
  2. T = zeros(N,1); % T用来存储每次模拟得到的时间
  3. for ii = 1:N % 开始进行 N 次模拟
  4. t = 0; % 初始化时间
  5. while 1 % 开始模拟小猫走出山洞的过程
  6. choose = randi(3); % 随机选择第几个门
  7. if choose == 1 % 选择第1个门
  8. t = t + 2; % 走2小时回到地面
  9. break % 小猫成功走出山洞,结束模拟
  10. elseif choose == 2 % 选择第2个门
  11. t = t + 4; % 走4小时回到原始出发点
  12. else % 选择第3个门
  13. t = t + 6; % 走6小时回到原始出发点
  14. end
  15. end
  16. T(ii) = t; % 记录每次模拟得到的时间
  17. end
  18. mean(T) % 计算所有模拟结果的平均值,即小猫走出山洞的期望时间的估计

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/822521
推荐阅读
相关标签
  

闽ICP备14008679号