代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
Java
】
三人射击智力题模拟
作者:
jxqlovedn
/ 发布于
2013/5/28
/
632
//游戏说明及游戏策略见代码,最终可以发现二号位小黄活下来的概率最高,获胜概率比33.58 : 41.82 : 24.60 //好像网上说我这种策略不对,菜鸟李第一枪应该放空枪,这种情况下小李活下来的概率最高,获胜概率比38.08 : 26.94 : 34.98 import java.util.HashMap; import java.util.Map; /** * @author jiangxiaoqiang * 求存活概率问题 * * 三个小伙子同时爱上了一 个姑娘,为了决定他们谁能娶这个姑娘,他们决定用手枪进行一次决斗。 * 小李的命中率是30%, * 小黄比他好些,命中率是50%, * 最出色的枪手是小林,他从不失 误,命中率是100%。 * 由于这个显而易见的事实,为公平起见,他们决定按这样的顺序:小李先开枪,小黄第二,小林最后。 * 然后这样循环,直到他们只剩下一个 人。 * 那么这三个人中谁活下来的机会最大呢?他们都应该采取什么样的策略? * * 很明显: * 小李应该先向小林射击,因为如果他向小黄射击,如果碰巧击中那他之后必死无疑,既然这样先向小黄 * 射击就没有意义了。 * 而小黄在小林还活着的情况,肯定也先向小林开枪。 * 而小林在小黄还活着的情况下自然先向命中率更高的小黄开枪。 */ public class ShootDemo { private static boolean isFirstAlive; // 小李是否活着 private static boolean isSecondAlive; // 小黄是否活着 private static boolean isThirdAlive; // 小林是否活着 private static Map<Boolean, Integer> counterDict = new HashMap<Boolean, Integer> (); static { counterDict.put(true, 1); counterDict.put(false, 0); } // 初始设置三人都存活 public static void init() { isFirstAlive = true; isSecondAlive = true; isThirdAlive = true; } // 开始射击游戏 public static void startGame() { init(); // 初始化 while(!isGameEnd()) { // 只要游戏未结束就一直持续下去 int shootNum = 0; // 射击点数 // 小李还存活,由他射击 if(isFirstAlive) { // 如果小林还存活就向小林开枪,如果小林挂了,那么说明小黄还活着,则向小黄开枪 shootNum = (int)(Math.random() * 10); if(shootNum <= 2) { // 命中率为十分之三 if(isThirdAlive) { isThirdAlive = false; } else { isSecondAlive = false; } } } // 小黄还活着,由他射击 if(isSecondAlive) { // 如果小林还活着就先向小黄开枪,毫无疑问;否则向小李开枪 shootNum = (int)(Math.random() * 2); if(shootNum == 1) { // 命中率为二分之一 if(isThirdAlive) { isThirdAlive = false; } else { isFirstAlive = false; } } } // 神枪手小林还活着 if(isThirdAlive) { // 如果小黄还活着,先向他射击 if(isSecondAlive) { isSecondAlive = false; } else { isFirstAlive = false; } } } } // 判断游戏是否结束 public static boolean isGameEnd() { return (counterDict.get(isFirstAlive)+ counterDict.get(isSecondAlive)+ counterDict.get(isThirdAlive)) == 1; } public static void main(String[] args) { int firstWin = 0, secondWin = 0, thirdWin = 0; for(int i = 0; i < 1000000; i++) { startGame(); if(isFirstAlive) { firstWin++; } if(isSecondAlive){ secondWin++; } if(isThirdAlive) { thirdWin++; } } System.out.println("小李共赢场数:" + firstWin); System.out.println("小黄共赢场数:" + secondWin); System.out.println("小林共赢场数:" + thirdWin); } }
试试其它关键字
同语言下
.
List 切割成几份 工具类
.
一行一行读取txt的内容
.
Java PDF转换成图片并输出给前台展示
.
java 多线程框架
.
double类型如果小数点后为零则显示整数否则保留两位小
.
将图片转换为Base64字符串公共类抽取
.
sqlParser 处理SQL(增删改查) 替换schema 用于多租户
.
JAVA 月份中的第几周处理 1-7属于第一周 依次类推 29-
.
java计算两个经纬度之间的距离
.
输入时间参数计算年龄
可能有用的
.
List 切割成几份 工具类
.
一行一行读取txt的内容
.
Java PDF转换成图片并输出给前台展示
.
java 多线程框架
.
double类型如果小数点后为零则显示整数否则保留两位小
.
将图片转换为Base64字符串公共类抽取
.
sqlParser 处理SQL(增删改查) 替换schema 用于多租户
.
JAVA 月份中的第几周处理 1-7属于第一周 依次类推 29-
.
java计算两个经纬度之间的距离
.
输入时间参数计算年龄
jxqlovedn
贡献的其它代码
(
1
)
.
三人射击智力题模拟
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3