某游戏规则中,甲乙双方每个回合的战斗总是有一方胜利,一方失败。
游戏规定:失败的一方要把自己的体力值的1/4加给胜利的一方。
例如:如果双方体力值当前都是4,则经过一轮战斗后,双方的体力值会变为:5,3。
现在已知:双方开始时的体力值甲:1000,乙:2000。
假设战斗中,甲乙获胜的概率都是50%
求解:双方经过4个回合的战斗,体力值之差小于1000的理论概率。
游戏规定:失败的一方要把自己的体力值的1/4加给胜利的一方。
例如:如果双方体力值当前都是4,则经过一轮战斗后,双方的体力值会变为:5,3。
现在已知:双方开始时的体力值甲:1000,乙:2000。
假设战斗中,甲乙获胜的概率都是50%
求解:双方经过4个回合的战斗,体力值之差小于1000的理论概率。
解决方案 »
- 前几天面试遇到的一道面试题。
- 给JPanel中的控件赋值
- 麻烦给一个“编号”的思想!
- static private FileSystem fs = FileSystem.getFileSystem();中的FileSystem是什么东东?
- 请问在什么情况下要实现serializable接口
- Observable到底用来做什么
- java 与 c++
- 请教如何配置网络数据库的连接池和数据源!
- 寻找有用Java开发游戏的经验的公司和个人,清留下联系地址
- connection pooling 问题,给我提示或实例,给你满意的分数!
- 【新手学java】关于方法的可变参数和forecah的用法
- 一个关于BufferedReader的问题!求救啊!
列出所有情况中体力值之差小1000的情况int B
B/2 *100% = 概率。
public class Fight implements Runnable{
static int result = 0;
static int total = 0;
public void fight(double ablood,double bblood,boolean flag,int count){
if(flag){
ablood +=bblood/4;
bblood = bblood *3/4;
}
else{
bblood +=ablood/4;
ablood = ablood *3/4;
}
if(count == 4){
System.out.println(Math.round(ablood) +" "+Math.round(bblood));
if(Math.abs(ablood - bblood)<1000){
result++;
}
total++;
}
else{
count++;
fight(ablood,bblood,true,count);
fight(ablood,bblood,false,count);
}
}
public void doFight(){
Person a = new Person(1000);
Person b = new Person(2000);
fight(a.blood,b.blood,true,1);
fight(a.blood,b.blood,false,1);
System.out.println((double)result/total *100 +"%");
}
public static void main(String args[]){
new Fight().doFight();
}
public void run(){
}
}
甲乙胜利概率是1/2,所以每种01组合的概率相同甲1回都没胜利,概率是1/2^4 = 1/16
0 0 0 0 >1000(双方体力值相差>1000)甲胜利1回,概率是4*1/16=1/4
0 0 0 1 计算体力值差
0 0 1 0
0 1 0 0
1 0 0 0 甲胜利2回
0 0 1 1 计算体力值差
0 1 0 1
0 1 1 0
1 0 0 1
1 0 1 0
1 1 0 0甲胜利3回
0 1 1 1 计算体力值差
1 0 1 1
1 1 0 1
1 1 1 0甲4回全胜
1 1 1 1 <1000在这16种情况中,体力值差<1000的占的比例就是所求的概率程序
import java.util.*;
public class Test {
double a = 1000;
double b = 2000;
double d = 0;
double cnt = 0;
List<Integer> list = new ArrayList<Integer>();
for (int i=0,t=i; i<16; i++,t=i) {
a = 1000;
b = 2000;
for (int j=0; j<4; j++,t>>=1) {
if (t%2 == 0) { //甲战斗失败`
d = a/4;
a -= d;
b += d;
} else if (t%2==1) { //甲战斗胜利
d = b/4;
a += d;
b -= d;
}
}
if ((b-a) < 1000) { //如果体力值相差小于1000
cnt++; //则统计累加
list.add(i);
}
} System.out.printf("4回合体力值相差小于1000的概率为%.2f\n", cnt/16);
System.out.println("发生的可能情况如下(0表示该回合甲战斗失败,1表示该回合甲战斗胜利):");
for (int i : list) {
StringBuilder buf = new StringBuilder();
buf.append(i%2);
i >>= 1;
for (int j=1; j<4; j++,i>>=1) {
buf.append(" ").append(i%2);
}
System.out.println(buf.reverse());
}
}
import java.util.*;
public class Test {
double a = 1000;
double b = 2000;
double d = 0;
double cnt = 0;
List<Integer> list = new ArrayList<Integer>();
for (int i=0,t=i; i<16; i++,t=i) {
a = 1000;
b = 2000;
for (int j=0; j<4; j++,t>>=1) {
if (t%2 == 0) { //甲战斗失败`
d = a/4;
a -= d;
b += d;
} else if (t%2==1) { //甲战斗胜利
d = b/4;
a += d;
b -= d;
}
}
if (Math.abs(b-a) < 1000) { //上面的代码这里失误了,应该是双方之差的绝对值<1000
cnt++; //则统计累加
list.add(i);
}
} System.out.printf("4回合体力值相差小于1000的概率为%.2f\n", cnt/16);
System.out.println("发生的可能情况如下(0表示该回合甲战斗失败,1表示该回合甲战斗胜利):");
for (int i : list) {
StringBuilder buf = new StringBuilder();
buf.append(i%2);
i >>= 1;
for (int j=1; j<4; j++,i>>=1) {
buf.append(" ").append(i%2);
}
System.out.println(buf.reverse());
}
}
import java.util.*;
public class Test {
double a = 1000;
double b = 2000;
double d = 0;
double cnt = 0;
List<Integer> list = new ArrayList<Integer>();
for (int i=0,t=i; i<16; i++,t=i) {
a = 1000;
b = 2000;
for (int j=0; j<4; j++,t>>=1) {
if (t%2 == 0) { //甲战斗失败`
d = a/4;
a -= d;
b += d;
} else if (t%2==1) { //甲战斗胜利
d = b/4;
a += d;
b -= d;
}
}
if (Math.abs(b-a) < 1000) { //上面的代码这里失误了,应该是双方之差的绝对值<1000
cnt++; //则统计累加
list.add(i);
}
} System.out.printf("4回合体力值相差小于1000的概率为%.2f\n", cnt/16);
System.out.println("发生的可能情况如下(0表示该回合甲战斗失败,1表示该回合甲战斗胜利):");
for (int i : list) {
StringBuilder buf = new StringBuilder();
buf.append(i%2);
i >>= 1;
for (int j=1; j<4; j++,i>>=1) {
buf.append(" ").append(i%2);
}
System.out.println(buf.reverse());
}
}