【概率题】小李、小黄、小林三个人互相决斗,谁存活的概率最高?

2023-11-06 03:20

本文主要是介绍【概率题】小李、小黄、小林三个人互相决斗,谁存活的概率最高?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、题目描述
  • 二、模拟结果
    • 1. 场景一:前一个人按顺序向后一个人射击
    • 2. 场景二:每个人射击的目标都是随机的
    • 3. 场景三:每个人射击的目标都是存活的人当中命中率最高的
  • 三、总结
  • 四、源码


一、题目描述


题目描述

  总是在贴吧里面刷到这个题目,但是大家对这个问题的答案五花八门,博主概率论也学得不太行,懒得算,于是就用计算机模拟了这个问题。由题目中并没有明确射击的方法,故博主设想了三个场景(暂时没有包含开空枪的情况)。以下为模拟的结果。


二、模拟结果

1. 场景一:前一个人按顺序向后一个人射击

  1000000次模拟后计算出来的平均胜率如下图所示:

模拟结果一
  可以看到在这种场景下,小李的存活率是最低的。粗略思考一下,小李的上家是百分百命中的小林,存活率当然是最低的。

2. 场景二:每个人射击的目标都是随机的

  1000000次模拟后计算出来的平均胜率如下图所示:

在这里插入图片描述
  可以看到在这种场景下,小李的存活率依然是最低的。但是小黄的存活率有所提高,但小林的存活率还是特别高。

3. 场景三:每个人射击的目标都是存活的人当中命中率最高的

  1000000次模拟后计算出来的平均胜率如下图所示:

在这里插入图片描述
  可以看到在这种场景下,结果发生了很大的变化,命中率最高的小林的存活率变成最低的了。所以高手也经不住乱枪啊。


三、总结

  在概率论吧、数学吧、考研吧等贴吧里面经常可以看多一些奇奇怪怪的概率问题,大家也经常争得面红耳赤。这时候不妨用编个程序模拟一下,用数据来证明自己!

四、源码

  下面附上源代码:

#include <iostream>
#include <vector>
#include <random>
#include <map>
using namespace std;// 全局变量
// 样本数量
static const long num = 1000000;
// 随机数种子
default_random_engine e((int)time(0));
uniform_real_distribution<double> u(0, 1);class Fighter
{
private:// 姓名string name;// 命中率double radio;public:// 构造函数Fighter(string n, double r){name = n;radio = r;}// 射击算法bool shoot(){double temp = u(e);cout<<temp<<endl;// 模拟是否击中if(temp <= radio){return true;}else{return false;}}double getRadio(){return radio;}string getName(){return name;}
};int main()
{Fighter li("小李", 0.3);Fighter huang("小黄", 0.5);Fighter lin("小林", 1);map<string, int> result1;result1[li.getName()] = 0;result1[huang.getName()] = 0;result1[lin.getName()] = 0;// 比赛方式一:小李先开枪,小黄第二个,小林最后,前一个人打后一个人for(int i = 0; i < num; ++i){vector<Fighter> fighters{li, huang, lin};int nowFighterId = 0;while(fighters.size() != 1){Fighter nowFighter = fighters[nowFighterId];if(nowFighter.shoot()){fighters.erase(fighters.begin() + (nowFighterId + 1) % fighters.size());}++nowFighterId;if(nowFighterId >= fighters.size()){nowFighterId = 0;}}result1[fighters.at(0).getName()]++;}map<string, int> result2;result2[li.getName()] = 0;result2[huang.getName()] = 0;result2[lin.getName()] = 0;// 比赛方式二:小李先开枪,小黄第二个,小林最后,随机打一个人srand((int)time(0));for(int i = 0; i < num; ++i){vector<Fighter> fighters{li, huang, lin};int nowFighterId = 0;while(fighters.size() != 1){Fighter nowFighter = fighters[nowFighterId];if(nowFighter.shoot()){if(fighters.size() > 2){fighters.erase(fighters.begin() + (nowFighterId + 1 + rand()%(fighters.size() - 1)) % fighters.size());}else{fighters.erase(fighters.begin() + (nowFighterId + 1) % fighters.size());}}++nowFighterId;if(nowFighterId >= fighters.size()){nowFighterId = 0;}}result2[fighters.at(0).getName()]++;}map<string, int> result3;result3[li.getName()] = 0;result3[huang.getName()] = 0;result3[lin.getName()] = 0;// 比赛方式三:小李先开枪,小黄第二个,小林最后,优先攻击命中率高的for(int i = 0; i < num; ++i){vector<Fighter> fighters{li, huang, lin};int nowFighterId = 0;while(fighters.size() != 1){Fighter nowFighter = fighters[nowFighterId];if(nowFighter.shoot()){if(fighters.size() > 2){if(fighters.at((nowFighterId + 1) % fighters.size()).getRadio() > fighters.at((nowFighterId + 2) % fighters.size()).getRadio()){fighters.erase(fighters.begin() + (nowFighterId + 1) % fighters.size());}else{fighters.erase(fighters.begin() + (nowFighterId + 2) % fighters.size());}}else{fighters.erase(fighters.begin() + (nowFighterId + 1) % fighters.size());}}++nowFighterId;if(nowFighterId >= fighters.size()){nowFighterId = 0;}}result3[fighters.at(0).getName()]++;}cout<<"比赛方式一:小李先开枪,小黄第二个,小林最后,前一个人打后一个人"<<endl;cout<<"小李的胜率为"<<result1[li.getName()] / (double)num * 100<<"%;"<<endl;cout<<"小黄的胜率为"<<result1[huang.getName()] / (double)num * 100<<"%;"<<endl;cout<<"小林的胜率为"<<result1[lin.getName()] / (double)num * 100<<"%;"<<endl;cout<<"比赛方式二:小李先开枪,小黄第二个,小林最后,随机打一个人"<<endl;cout<<"小李的胜率为"<<result2[li.getName()] / (double)num * 100<<"%;"<<endl;cout<<"小黄的胜率为"<<result2[huang.getName()] / (double)num * 100<<"%;"<<endl;cout<<"小林的胜率为"<<result2[lin.getName()] / (double)num * 100<<"%;"<<endl;cout<<"比赛方式三:小李先开枪,小黄第二个,小林最后,优先攻击命中率高的"<<endl;cout<<"小李的胜率为"<<result3[li.getName()] / (double)num * 100<<"%;"<<endl;cout<<"小黄的胜率为"<<result3[huang.getName()] / (double)num * 100<<"%;"<<endl;cout<<"小林的胜率为"<<result3[lin.getName()] / (double)num * 100<<"%;"<<endl;return 0;
}

这篇关于【概率题】小李、小黄、小林三个人互相决斗,谁存活的概率最高?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/354193

相关文章

hdu4865(概率DP)

题意:已知前一天和今天的天气概率,某天的天气概率和叶子的潮湿程度的概率,n天叶子的湿度,求n天最有可能的天气情况。 思路:概率DP,dp[i][j]表示第i天天气为j的概率,状态转移如下:dp[i][j] = max(dp[i][j, dp[i-1][k]*table2[k][j]*table1[j][col] )  代码如下: #include <stdio.h>#include

MFC中App,Doc,MainFrame,View各指针的互相获取

纸上得来终觉浅,为了熟悉获取方法,我建了个SDI。 首先说明这四个类的执行顺序是App->Doc->Main->View 另外添加CDialog类获得各个指针的方法。 多文档的获取有点小区别,有时间也总结一下。 //  App void CSDIApp::OnApp() {      //  App      //  Doc     CDocument *pD

hot100刷题第1-9题,三个专题哈希,双指针,滑动窗口

求满足条件的子数组,一般是前缀和、滑动窗口,经常结合哈希表; 区间操作元素,一般是前缀和、差分数组 数组有序,更大概率会用到二分搜索 目前已经掌握一些基本套路,重零刷起leetcode hot 100, 套路题按套路来,非套路题适当参考gpt解法。 一、梦开始的地方, 两数之和 class Solution:#注意要返回的是数组下标def twoSum(self, nums: Lis

Jasperreports+jaspersoft studio学习教程(七)- 子报表Subreport(父子报表互相传值)

转载:https://blog.csdn.net/shiyun123zw/article/details/79221708 有很多人都说Jasperreports不适合中国式复杂报表,实际上运用好父子报表可以解决大部分问题了。例如下面的表。每个学生的学科数目不固定,且每个学生后有相当于小计的平均分。有点复杂度的报表,可以使用子报表解决。 8.1 设计报表模板 8.1.1 新建主模板De

概率DP (由一道绿题引起的若干问题。目前为一些老题,蒟蒻的尝试学习1.0)

概率DP: 利用动态规划去解决 概率 期望 的题目。 概率DP 求概率(采用顺推) 从 初始状态推向结果,同一般的DP类似,只是经历了概率论知识的包装。 老题: 添加链接描述 题意: 袋子里有w只白鼠,b只黑鼠,A和B轮流从袋子里抓,谁先抓到白色谁就赢。A每次随机抓一只,B每次随机 抓完一只后 会有另外一只随机老鼠跑出来。如果两个人都没有抓到白色,那么B赢。A先抓,问A赢得概率。 w b 均在

2024国赛论文拿奖快对照这几点及评阅要点,勿踩雷区!(国赛最后冲刺,提高获奖概率)

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 2024“高教社杯”全国大学生数学建模竞赛已过去第三个夜晚,小伙伴们都累了没有,如果感到思维滞涩,别忘了稍作休息,放松一下自己,准备迎接国赛非常重要的收尾阶段——论文。 国赛这几天的努力最后都

OOP三个基本特征:封装、继承、多态

OOP三个基本特征:封装、继承、多态 C++编程之—面向对象的三个基本特征 默认分类 2008-06-28 21:17:04 阅读12 评论1字号:大中小     面向对象的三个基本特征是:封装、继承、多态。     封装 封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。   封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信

三个同步与互斥问题之生产者与消费者

#include<stdio.h> #include<pthread.h> pthread_mutex_t  mutex; #define Max 10 pthread_cond_t pro; pthread_cond_t con; int buffer=0;//全局变量----一开始为0,只有生产者可以执行 void deal_produce(

三个同步与互斥问题之哲学家就餐

#include<stdio.h> #include <semaphore.h> #include<pthread.h> //筷子作为mutex   pthread_mutex_t chopstick[5] ;   int eatnum[5]={5,5,5,5,5}; void *eat_think(void *arg)   {       int i= *(cha

【linux 磁盘管理】Linux磁盘管理常用三个命令为df、du和fdisk。

Linux磁盘管理好坏管理直接关系到整个系统的性能问题。 Linux磁盘管理常用三个命令为df、du和fdisk。 df:列出文件系统的整体磁盘使用量du:检查磁盘空间使用量fdisk:用于磁盘分区 [root@izbp1f0leha0lvmqfhigzpz code]# dfFilesystem 1K-blocks Used Available Use% Mounted