Update: found the bug in my pass code that was skewing statistics. It didn't change my final answer, but the probabilities come in much, much closer. This also makes me think if I can work out an optimization for worst passing, it could catch that last percent difference and make it the best choice.
The answer is
The Mediocre!
I may or may not have written a simulation to test this several million times in different variations to help me...
If the worst passes every time, then mediocre still has a roughly 34% chance to win, compared to 32% and 33%.
Run 1:
The best's win count: 321451
The mediocre's win count: 344495
The worst's win count: 334054
Run 2:
The best's win count: 321761
The mediocre's win count: 343515
The worst's win count: 334724
Run 3:
The best's win count: 322009
The mediocre's win count: 343636
The worst's win count: 334355
and,
If the worst doesn't ever pass, mediocre has a roughly 48% chance to win, with the difference split between the other two options. This option should be eliminated as a possibility given the players ability to pick the optimal strategy (worst passing).
Run 1:
The best's win count: 260989
The mediocre's win count: 479366
The worst's win count: 259645
Run 2:
The best's win count: 261143
The mediocre's win count: 479403
The worst's win count: 259454
Run 3:
The best's win count: 260462
The mediocre's win count: 479958
The worst's win count: 259580
Code below for those who are curious/might have some input to improve.
<?php
$o1_win_count = 0;
$o2_win_count = 0;
$o3_win_count = 0;
$i=0;
//$check1 = 0;
//$check2 = 0;
while($i < 1000000){
$o1 = array('hc'=>0, 'status'=>"");
$o2 = array('hc'=>0, 'status'=>"");
$o3 = array('hc'=>0, 'status'=>"");
$i++;
$v1 = rand(0,10000)/10000;
$v2 = rand(0,10000)/10000;
$v3 = rand(0,10000)/10000;
if($v1 > $v2 && $v1 > $v3 && $v2 != $v3){
$o1['hc'] = $v1;
if($v2 > $v3){
$o2['hc'] = $v2;
$o3['hc'] = $v3;
}
else{
$o2['hc'] = $v3;
$o3['hc'] = $v2;
}
}
elseif($v2 > $v1 && $v2 > $v3 && $v1 != $v3){
$o1['hc'] = $v2;
if($v1 > $v3){
$o2['hc'] = $v1;
$o3['hc'] = $v3;
}
else{
$o2['hc'] = $v3;
$o3['hc'] = $v1;
}
}
elseif($v3 > $v1 && $v3 > $v2 && $v1 != $v2){
$o1['hc'] = $v3;
if($v1 > $v2){
$o2['hc'] = $v1;
$o3['hc'] = $v2;
}
else{
$o2['hc'] = $v2;
$o3['hc'] = $v1;
}
}
else{
$i--;
continue; //duplicate random values, restart this attempt
}
// o1 is "the best", o2 is "the mediocre", o3 is "the worst"
while($o1['status'] == "" || $o2['status'] == "" || $o3['status'] == ""){
$hit = rand(0,10000)/10000;
//option 3 goes first, aims at option 1 if alive, 2 if 1 is dead, unless passing
$pass = 0;
//$diff1 = $o2['hc'] - $o3['hc'];
//$diff2 = $o1['hc'] - $o2['hc'];
/*if($o3['hc'] >= .32){ //change these out as desired, I was just doing guess and check to watch win count change for reference - could've missed possibilties in my guess and check
$pass = 1;
}*/
$pass = 1;
if($pass == 1){
if($o2['status'] == "dead" || $o1['status'] == "dead"){ //skip as worst if all players in the game
if($o3['status'] != "dead" && $o3['hc'] >= $hit){
if($o1['status'] != "dead"){
$o1['status'] = "dead";
if($o2['status'] == "dead"){
$o3['status'] = "alive";
$o3_win_count++;
}
}
elseif($o2['status'] != "dead"){
$o2['status'] = "dead";
$o3['status'] = "alive";
$o3_win_count++;
}
else{
//shouldn't get here
$o3['status'] = "alive";
$o3_win_count++;
}
}
}
}
else{
if($o3['status'] != "dead" && $o3['hc'] >= $hit){
if($o1['status'] != "dead"){
$o1['status'] = "dead";
if($o2['status'] == "dead"){
$o3['status'] = "alive";
$o3_win_count++;
}
}
elseif($o2['status'] != "dead"){
$o2['status'] = "dead";
$o3['status'] = "alive";
$o3_win_count++;
}
else{
//shouldn't get here
$o3['status'] = "alive";
$o3_win_count++;
}
}
}
$hit = rand(0,10000)/10000;
//option 2 goes second, aims at 1 if alive, 3 if 1 is dead
if($o2['status'] != "dead" && $o2['hc'] >= $hit){
if($o1['status'] != "dead"){
$o1['status'] = "dead";
if($o3['status'] == "dead"){
$o2['status'] = "alive";
$o2_win_count++;
}
}
elseif($o3['status'] != "dead"){
$o3['status'] = "dead";
$o2['status'] = "alive";
$o2_win_count++;
}
else{
//shouldn't get here
$o2['status'] = "alive";
$o2_win_count++;
}
}
$hit = rand(0,10000)/10000;
//option 1 goes last, aims at 2 if alive, 3 if 2 is dead
if($o1['status'] != "dead" && $o1['hc'] >= $hit){
if($o2['status'] != "dead"){
$o2['status'] = "dead";
if($o3['status'] == "dead"){
$o1['status'] = "alive";
$o1_win_count++;
}
}
elseif($o3['status'] != "dead"){
$o3['status'] = "dead";
$o1['status'] = "alive";
$o1_win_count++;
}
else{
//shouldn't get here
$o1['status'] = "alive";
$o1_win_count++;
}
}
}
}
echo "The best's win count: ".$o1_win_count."<br>";
echo "The mediocre's win count: ".$o2_win_count."<br>";
echo "The worst's win count: ".$o3_win_count."<br>";
?>