本文主要是介绍【概率题】小李、小黄、小林三个人互相决斗,谁存活的概率最高?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 一、题目描述
- 二、模拟结果
- 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;
}
这篇关于【概率题】小李、小黄、小林三个人互相决斗,谁存活的概率最高?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!