[java,2019-01-28] 枪手博弈,谁才是最后赢家
什么是枪手博弈:
枪手博弈指彼此痛恨的甲乙丙三个枪手准备决斗。甲枪法最好,十发八中。乙枪法次之,十发六中。丙枪法最差,十发四中。假设他们了解彼此实力,也能做出理性判断。
问题一:如果三人同时开枪,并且每人每次只发一枪。若干轮枪战后,谁活下来的机会大?
问题二:如果三人轮流开枪,并且由枪法最差的丙先开枪,他该怎么做?
问题一:
分析:
3个人同时开枪,则枪手开枪的同时也可能被射死,4种情况,场上分别剩余(3,2,1,0)人
1)场上剩余3人,此时a(甲)一定向b(乙)射击,b一定向a射击,c(丙)可能向a射击或向空射击
2)场上剩余2人,互射,无其他可能
3)场上剩余1人,最后的胜利者
4)场上剩余0人,全部死亡
抽象出枪手模型
public class Hackbuteer {
private int state=1; //存活状态,1存活,0死亡
private double shot_rate; //命中率
public Hackbuteer(double shot_rate){
this.shot_rate=shot_rate;
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
public double getShot_rate() {
return shot_rate;
}
public void setShot_rate(double shot_rate) {
this.shot_rate = shot_rate;
}
public boolean shot(Hackbuteer target) {
double rand = Math.random();
if(rand<shot_rate){ //随机数小于命中率,表示命中
target.state=0; //目标死亡
return true;
}
return false;
}
}
模拟多次(100w)射击,用频率估算概率,代码如下:
public class HackbuteerTest {
public static void main(String[] args) {
int a_count=0; //a存活次数
int b_count=0; //b存活次数
int c_count=0; //c存活次数
for(int i=0;i<1000000;i++){
Hackbuteer a=new Hackbuteer(0.8);
Hackbuteer b=new Hackbuteer(0.6);
Hackbuteer c=new Hackbuteer(0.4);
while(true){
int all_state=a.getState()+b.getState()+c.getState(); //场上存活状态
if(all_state==3){ //3人都存活
a.shot(b);
b.shot(a);
//c.shot(a); //c向a射击;若模拟向空射击,则注释此行
}else if(all_state==2){ //1人死亡,2人存活
if(a.getState()==0){
b.shot(c);
c.shot(b);
}
if(b.getState()==0){
a.shot(c);
c.shot(a);
}
if(c.getState()==0){
b.shot(a);
a.shot(b);
}
}else if(all_state==1 //仅有一人存活
|| all_state==0 //无人存活
){
if(a.getState()==1){
a_count++;
}
if(b.getState()==1){
b_count++;
}
if(c.getState()==1){
c_count++;
}
break;
} }
}
System.out.println("a存活--"+a_count);
System.out.println("b存活--"+b_count);
System.out.println("c存活--"+c_count);
System.out.println("无人存活--"+(1000000-a_count-b_count-c_count)); }
}
结果:
c向a射击,c向空射击
,
所以对于c来说,在同时开枪的情况下,c应该向a开枪,而不是向空开枪。
PS:以上结果仅代表实验100w次的频率,不完全代表概率。
问题二:
分析:
3人轮流开枪,c先开枪,依然是2种方案(向a射击,向空射击),代码如下:
public class HackbuteerTest2 {
public static void main(String[] args) {
int a_count=0; //a存活次数
int b_count=0; //b存活次数
int c_count=0; //c存活次数
for(int i=0;i<1000000;i++){
Hackbuteer a=new Hackbuteer(0.8);
Hackbuteer b=new Hackbuteer(0.6);
Hackbuteer c=new Hackbuteer(0.4);
while(true){
//c存活,开枪策略1,优先射击a
if(c.getState()==1){
if(a.getState()==1){
c.shot(a);
}else if(b.getState()==1){
c.shot(b);
}
}
//c存活,开枪策略2,当a,b都存活时,不射击任何人
// if(c.getState()==1){
// if(a.getState()==0 && b.getState()==1){
// c.shot(b);
// }else if(a.getState()==1 && b.getState()==0){
// c.shot(a);
// }
// } //a存活,开枪策略,优先射击b
if(a.getState()==1){
if(b.getState()==1){
a.shot(b);
}else if(c.getState()==1){
a.shot(c);
}
}
//b存活,开枪策略,优先射击a
if(b.getState()==1){
if(a.getState()==1){
b.shot(a);
}else if(c.getState()==1){
b.shot(c);
}
} if(a.getState()+b.getState()+c.getState()==1){ //仅有一人存活
if(a.getState()==1){
a_count++;
}
if(b.getState()==1){
b_count++;
}
if(c.getState()==1){
c_count++;
}
break;
} }
}
System.out.println("a存活--"+a_count);
System.out.println("b存活--"+b_count);
System.out.println("c存活--"+c_count);
}
}
结果:
c向a射击,c向空射击
显然,此时c应该向空射击,而不是向a射击
PS:当射击顺序为(c-b-a时,结论依然如此)
结论:
火并也要按照基本法,同时开枪有1/4-1/3的概率全部玩完(你是不是以为我要说什么实力很重要,选择很重要,背叛与忠诚?)
[java,2019-01-28] 枪手博弈,谁才是最后赢家的更多相关文章
- [Java 教程 01] Hello,Java!
前言 从事编程已经有一段时间了,突然发现,Java作为我的第一编程语言,自己似乎对她并有一个系统的思想.当下Java依旧保持着超高的热度,新特性也不断出现,从当初学习的java6版本到最近刚出的jav ...
- Tensorflow学习笔记2019.01.22
tensorflow学习笔记2 edit by Strangewx 2019.01.04 4.1 机器学习基础 4.1.1 一般结构: 初始化模型参数:通常随机赋值,简单模型赋值0 训练数据:一般打乱 ...
- 091 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 01 static关键字(上)
091 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...
- Java学习01
Java学习01 第一章 1.JRE与JDK JDK(JAVA Develop Kit,JAVA开发工具包)提供了Java的开发环境和运行环境,主要用于开发JAVA程序,面向Java程序的开发者; J ...
- 「FFT」题单(upd 2019.4.28)
持续更新(last upd 2019.4.28) ZJOI2014 力 [题目链接] 解法 对原式进行转换,然后卷积FFT套上去求解就可以了. 推导过程简洁版: \[F_i=\sum_{j<i} ...
- Tensorflow学习笔记2019.01.03
tensorflow学习笔记: 3.2 Tensorflow中定义数据流图 张量知识矩阵的一个超集. 超集:如果一个集合S2中的每一个元素都在集合S1中,且集合S1中可能包含S2中没有的元素,则集合S ...
- AWS re:Invent(2019.01.09)
时间:2019.01.09地点:北京国际饭店
- Alpha冲刺(5/10)——2019.4.28
所属课程 软件工程1916|W(福州大学) 作业要求 Alpha冲刺(5/10)--2019.4.28 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪 ...
- 2019.3.28&2019.3.30考试
2019.3.28 : 肥肠爆芡,因为这场考试的题太屑了,所以我咕咕了 Upd on 2019.3.30 压进来一篇(因为都没啥意义) 2019.3.30 : 全机房读错题+没有大样例=T2全体爆炸 ...
随机推荐
- 20155219付颖卓《网络对抗》EXP7网络欺诈技术防范
实验后回答问题 1.通常在什么场景下容易受到DNS spoof攻击 在公共共享网络里,并且同一网段可以ping通的网络非常容易被攻击. 2.在日常生活工作中如何防范以上两攻击方法 不在不信任的公开网络 ...
- switch_case注意事项
1.switch 语句有至少一个 case 代码块和一个可选的 default 代码块. 这里的 switch 从第一个 case 分支比较 a 的值,值为 3 匹配失败.然后比较 4.匹配,所以从 ...
- Pytho的历史和语言介绍
1.Python的历史 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,Guido开始写Python语言的编译器.Python这个名字,来自Guido ...
- 慢慢啃css
上个礼拜清明放假了,所有忘记更新了,但是每天的学习没有落下,嘿嘿嘿~ 可是这两天就很头疼了,因为发烧了,呜呜呜~昨天在床上睡了一天,四肢无力,头晕眼花,严重的发烧,想靠自己的免疫力扛过去,缺没有. 今 ...
- tensorflow 代码阅读
具体实现: https://github.com/tensorflow/tensorflow/tree/master/tensorflow/core/framework 『深度长文』Tensorflo ...
- XSS(四)攻击防御
XSS Filter XSS Filter的作用是过滤用户(客户端)提交的有害信息,从而达到防范XSS攻击的效果 XSS Filter作为防御跨站攻击的主要手段之一,已经广泛应用在各类Web系统之中, ...
- vue添加class类名
<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...
- 面试题-linux基础
Linux基础和git linux的基础命令(怎么区分一个文件还是文件夹) ls -F 在显示名称的时候会在文件夹后面添加“/”, 在文件后面加“*” 日志以什么格式,存放在哪里?日志可以存储在“/ ...
- 剑指offer 5.栈和队列 用两个栈实现队列
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题思路:1,整体思路是元素先依次进入栈1,再从栈1依次弹出到栈2,然后弹出栈2顶部的元素,整个过程 ...
- 关于CPU 架构与指令集的一些个人理解
关于CPU 架构与指令集的一些个人理解 (理解不一定正确,只是目前的理解) 1.一般所说的X86,是指基于Intel X86架构处理器的一套指令集,即X86指令集: 2.CPU的架构是最底层的,是处理 ...