Java &引用;“三射手算法”;

Java &引用;“三射手算法”;,java,algorithm,probability,Java,Algorithm,Probability,正如标题所说,你有3个“射手”:射手A,B和C。 规则如下: 每个人都有不同的命中机会: 射手A的命中率为100%。 射手B的命中率为80%。 射击手C的命中率为50%。 每个射手在被击中一次后都会死亡,并将被移除。 每个射手都会优先命中命中几率最高的仍然活着的射手。f、 e如果所有射击手都活着:C射击A,B射击A,A射击B。 轮到每个射手时,他只能射一颗子弹。 每开始一个新游戏都会让三个射手中的一个随机开始。 一旦一名射手完成了他的回合(如果该射手不是唯一一名站着的射手),下一个要玩的射手将被

正如标题所说,你有3个“射手”:射手ABC
规则如下: 每个人都有不同的命中机会:
射手A的命中率为100%。
射手B的命中率为80%。
射击手C的命中率为50%。 每个射手在被击中一次后都会死亡,并将被移除。 每个射手都会优先命中命中几率最高的仍然活着的射手。f、 e如果所有射击手都活着:C射击AB射击AA射击B。 轮到每个射手时,他只能射一颗子弹。 每开始一个新游戏都会让三个射手中的一个随机开始。 一旦一名射手完成了他的回合(如果该射手不是唯一一名站着的射手),下一个要玩的射手将被随机挑选,而刚刚玩过他的回合的射手将不能再被挑选(这意味着刚刚玩过的射手不能连续玩两个回合,但在下一个回合后他可以再次玩)。 一场比赛只有在最后一个投手站着的情况下有一个胜利者时才能结束。
_________________________________________________________________________ 现在,我的任务是找出每个射击手在。。比方说,200万场。
我的结果如下:
A:0.2344525(23.4%),B:0.3187745(31.8%),C:0.446773(44.6%)。
我们班上没有给出正式的答案,几乎每个和我一起检查过的人都有自己不同的答案

我用于解决此场景的代码是否正确(以向我提供正确答案的形式)?

publicstaticcharshooters(){
char winner='x';//'x'表示还没有赢家
字符a='v',b='v',c='v';//'v'表示它们还活着
双回合=数学随机()*3,射击;
/*转向:
0比1意味着轮到a了。
1比2意味着轮到b了。
2比3总是意味着该轮到c了。
*/
while(winner=='x'){//winner将在结束时更改为'a','b'或'c'
如果(圈数<1){//A开始(1.0)
b='x';//b'死了。
turn=2.5;//现在轮到c了。
}如果(圈数<2){//B开始(0.8)
shoot=Math.random();
如果(shoot=1){//因为我们不能让b'连续玩下一个回合:
turn++;//调整以表示c的回合而不是b的回合。
}
}否则{
turn=2.5;//c的回合,因为a已经死了。
}
}
}else{//C开始(0.5)
shoot=Math.random();

如果(拍摄)你应该分享你如何获得这些结果的方法,这样我们就可以告诉你你的方法是否正确。(是的,这不是问这个问题的正确地方,但它足够有趣,所以等着看它的走向。)我投票将这个问题作为离题题来结束,因为这是一个概率问题,应该询问代码是否确实需要一些优化,再加上需要一些努力来“解码”您的逻辑(例如
turn=1.5;
a='x';
)这个问题怎么会被搁置?OP演示了如何用他/她自己的代码以编程方式解决。有人可能会说这个问题属于数学,但它也属于这里…@Shashank这是一个谷歌文档,详细介绍了我的微积分(仍在版本中):
public static char shooters(){
        char winner = 'x';//'x' means that there's no winner yet
        char a = 'v', b = 'v', c = 'v';//'v' means that they're alive
        double turn = Math.random()*3, shoot;
        /*turn:
          0 to 1 will always mean it's a's turn.
          1 to 2 will always mean it's b's turn.
          2 to 3 will always mean it's c's turn.
        */
        while(winner == 'x'){//winner will change to 'a', 'b' or 'c' upon ending
            if(turn < 1){//A starts (1.0)
                b = 'x';//b' is dead.
                turn = 2.5;//c's turn now.
            }else if(turn < 2){//B starts (0.8)
                shoot = Math.random();
                if(shoot <= 0.8){//b hits
                    if(a == 'v' && c == 'v'){//both opponents alive, a goes down
                        a = 'x';//a' is dead.
                        turn = 2.5;//c's turn now.
                    }else{
                        winner = 'b';//whatever the case, b will hit the last competitor left.
                    }
                }else{//b misses
                    if(a == 'v' && c == 'v'){
                        turn = Math.random()*2;
                        if(turn >= 1){//since we can't let b' play the next turn consecutively:
                            turn++;//adjust to represent c's turn instead of b's.
                        }
                    }else{
                        turn = 2.5;//c's turn, since a is dead.
                    }
                }
            }else{//C starts (0.5)
                shoot = Math.random();
                if(shoot <= 0.5){//c hits
                    if(a == 'v' && b == 'v'){//both opponents alive, a goes down
                        a = 'x';//a' is dead.
                        turn = 1.5;//b's turn now.
                    }else{
                        winner = 'c';//whatever the case, c will hit the last competitor left.
                    }
                }else{//c misses
                    if(a == 'v' && b == 'v'){
                        turn = Math.random()*2;
                    }else if(a == 'v'){
                        winner = 'a';//a's turn since b is dead which leads to c dying.
                    }else{
                        turn = 1.5;//b's turn, since a' is dead.
                    }
                }
            }
        }
        return winner;
    }