某游戏规则中,甲乙双方每个回合的战斗总是有一方胜利,一方失败。
游戏规定:失败的一方要把自己的体力值的1/4加给胜利的一方。
例如:如果双方体力值当前都是4,则经过一轮战斗后,双方的体力值会变为:5,3。
现在已知:双方开始时的体力值甲:1000,乙:2000。
假设战斗中,甲乙获胜的概率都是50%
求解:双方经过4个回合的战斗,体力值之差小于1000的理论概率。

解决方案 »

  1.   

    列出4个回合的所有情况,int A
    列出所有情况中体力值之差小1000的情况int B
    B/2 *100% = 概率。
      

  2.   


    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(){

    }
    }
      

  3.   

    4个回合,可以看成如下的组合,0表示甲战斗失败,1表示甲战斗胜利
    甲乙胜利概率是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());
        }
    }
      

  4.   

    上面的代码有点小失误
    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());
        }
    }
      

  5.   

    上面的代码有点小失误
    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());
        }
    }