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

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

相关文章

Linux float int和16进制互相转换

Linux 上float int和16进制互换操作。之前把float转16进制,也就是转成4个字节,方便使用串口传输嘛。使用的方法是: //float 转 16进制float x_pid_p = 15.0;unsigned char * bValue = (unsigned char *)& x_pid_p;printf("%x\t%x\t%x\t%x\n", bValue[0], bVa

概率之常用概率分布

1. Bernoulli分布 单个二值随机变量的分布。它由单个参数控制,给出了随机变量等于1的概率。它具有如下的一些性质。 2. Multinoulli分布 Multinoulli分布(multinoulli distribution)或者范畴分布(categorical distribution)是指在具有k个不同状态的单个离散型随机变量上的分布,其中k是一个有限值。

概率之基础概念

1 概率分布(probability distribution) 用来描述随机变量或一簇随机变量在每一个可能取到的状态的可能性大小。描述概率分布的方式取决于随机变量是离散的还是连续的。 离散型变量和概率质量函数(probability mass function, PMF) 离散型随机变量的概率分布可以用PMF来描述。通常使用大写字母P来表示PMF。例如。 PMF将随机变量能够取得的每个状

机器学习算法(二):1 逻辑回归的从零实现(普通实现+多项式特征实现非线性分类+正则化实现三个版本)

文章目录 前言一、普通实现1 数据集准备2 逻辑回归模型3 损失函数4 计算损失函数的梯度5 梯度下降算法6 训练模型 二、多项式特征实现非线性分类1 数据准备与多项式特征构造2 逻辑回归模型 三、逻辑回归 --- 正则化实现1 数据准备2 逻辑回归模型3 正则化损失函数4 计算损失函数的梯度5 梯度下降6 训练模型 总结 前言 今天我们开始介绍逻辑回归的从零开始实现代码了,

java编程:命令行输入的三个整数判断是否构成三角形,不能就抛异常。

写一个方法void sanjiao(int a,int b,int c),判断三个参数是否能构成一个三角形,如果不能则抛出 异常IllegalArgumentException,显示异常信息“a,b,c不能构成三角形”, 如果可以构成则显示三角形三个边长,在主方法中得到命令行输入的三个整数,调用此方法,并捕获异常。 附源代码: package 异常;public class Sa

C语言编程:青年歌手参加歌曲大奖赛,有10个评委打分(满分10分),去掉最高最低分后,试编程求选手的平均得分

C语言编程:青年歌手参加歌曲大奖赛,有10个评委打分(满分10分),去掉最高最低分后,试编程求选手的平均得分: 代码如下: #include<stdio.h>void main(){int sum = 0,i;double avg,b;int a[10];int max,min;for(i=0;i<10;i++){scanf("%d",&a[i]);if(i==0)//只有第一次赋值m

转:三个鹿念啥?三个风念啥?三个······

三个金念鑫( xīn )      三个水念淼( miǎo )    三个火念焱( yàn )       三个土念垚( yáo ) 三个牛念犇( bēn )    三个手念掱( pá )        三个目念瞐( mò )        三个田念畾( lěi ) 三个马念骉( biāo ) 三个羊念羴( shān )     三个犬念猋( bi

csdn上传源码资源卖钱能买房买车吗?每天最高收入200-500?

csdn上传源码卖钱能买房买车吗,最高收入200-500? 作者收入日榜 不***孩 收益617.32元 程***妍 收益534.56元 s***n 收益323.71元 盈***客 收益315.05元 极***计 收益284.17元

三个 insert 导致的死锁问题

锁种类 插入意向锁(insert intention lock)对已有数据行的修改与删除,必须加强互斥锁 X 锁,那对于数据的插入,是否还需要加这么强的锁,来实施互斥呢?插入意向锁,孕育而生。插入意向锁是间隙锁(Gap Locks)的一种,它是专门针对 insert 操作的,也是为数不多的在 RC 级别下产生 Gap 锁情况 锁兼容性 排他锁 X排他意向锁 IX共享锁 S共享意向锁 IS排他

概率p输出1,概率1-p输出0,等概率输出0和1

有个输出0和1的BIASED RANDOM,它以概率p输出1,以概率1-p输出0,以此RANDOM函数为基础,生成另一个RANDOM函数,该函数以1/2的概率输出1,以1/2的概率输出0 题目解答: 两次调用该RANDOM函数,如果其概率为P(x),调用2次 P(1) = p       P(0) = 1-p P'(1) =p      P'(0) = 1-p 概率如下: 11