¿Cuál es la duración esperada de un juego de Guerra?

En el juego de cartas War , repartes una baraja estándar de 52 cartas entre dos jugadores. Los jugadores voltean las cartas y gana la carta más alta. En el caso de empates (guerras), cada jugador juega N cartas adicionales y el jugador con la N-ésima carta más alta gana todas las cartas (los empates posteriores siguen las mismas reglas). El juego puede durar mucho tiempo y parece que nunca dura poco tiempo.

¿Cuál es el número esperado de "vueltas" hasta que se complete el juego?

Aprendí a jugar a la guerra con N igual a 3 (es decir, en una guerra se juegan un total de 10 cartas: el empate original, 3 boca abajo y una carta final de comparación).

Para completar, suponga que el juego termina si un jugador tiene menos de 5 cartas y entra en guerra (es decir, no tiene una carta final para voltear).

Suponga que al jugar su última carta de su mano, baraja las cartas ganadoras en un orden aleatorio y continúa.

Suponga que las tarjetas están en orden aleatorio para comenzar.

Según el artículo de Wikipedia que vinculaste, ambos jugadores juegan dos cartas de suma, no cuatro. El ganador se lleva las cuatro (2*2) cartas.
Además, dependería de cómo se devuelvan las cartas capturadas al mazo del ganador. Si solo se colocan en la parte inferior de la plataforma, eso podría afectar la respuesta a la pregunta. Además, si las 52 cartas se dividen perfectamente en dos montones idénticos, ¿supondría que el juego termina en empate? ¿Eso contaría como que el juego se está completando?
@Phil tienes razón, no cómo crecí jugando y no cómo mi hijo aprendió de sus amigos, pero está bien. Actualizará.
@Phil, ¿la edición cubre todo?
Además, solo he oído hablar de las 3 cartas adicionales más una cuarta para una nueva regla de comparación.
Esta podría ser una mejor pregunta para el foro de matemáticas, ya que tienden a ser mejores en preguntas de probabilidad complicadas.

Respuestas (4)

La guerra en realidad no es un juego sino un autómata , ya que los jugadores no tienen opciones.

Wimpy Programmer ya hizo esta simulación , descubrió que al barajar las cartas ganadoras, el número medio de vueltas es 262 , la moda es 84 y el máximo (en una muestra de 100.000 intentos) es 2.702 vueltas. También descubrió que sin barajar las cartas ganadoras, el juego podría ser interminable.

Usó N=2 mientras juegas con N=3, más alto N acorta el juego, sin embargo, no creo que haga una gran diferencia.

turnos de guerra hasta que alguien gane (mil)

Debe haber un error en esta simulación, ya que encuentra que 1 de cada 8 juegos dura más de 5000 turnos, posiblemente infinitos. Este nunca ha sido mi caso en la realidad, y juego sin barajar las cartas que reemplazo.
Puede ser un error en la simulación (el código está en el enlace), sin embargo, puedo pensar en otras explicaciones: tal vez juegues con N !=2, tal vez cuando juegues en la realidad haya un barajado involuntario.
¡También hice una simulación de guerra sin saber que esto existía! github.com/sambecker/rustwar Curiosamente, promedié constantemente los 233turnos con barajar y los 560–570giros sin barajar (excluyendo 8%más o menos los juegos que nunca terminan). Me encantaría comparar estos dos enfoques, ver dónde podrían existir diferencias/casos límite en la lógica. cc @Cohensius
@sambecker, eso sería bueno, siéntase libre de agregar cualquier información relevante de la comparación. Puede intentar ponerse en contacto con Drew the WimpyProgrammer con un DM en twitter.com/wimpyprogrammer

Como problema matemático, este es un caso de un paseo aleatorio ("pasear" N cartas a un paso del mazo de tu oponente al tuyo, donde N suele ser uno, pero puede ser 4 o 7 o lo que sea dependiendo de los empates). a menudo se enmarca como el problema de "la ruina de los jugadores". Ignorando el tema de los empates y tratando cada tirada de cartas como una prueba independiente, el promedio de turnos es 26*26 = 676 turnos.

Tener en cuenta los empates lo reduciría bastante en función de N, lo que permitiría pasos más grandes ocasionalmente. El número medio de turnos cuando el tamaño del paso es 5 (es decir, cada turno es una guerra que se resuelve en su primer desempate) es equivalente a jugar con 6 cartas cada uno (26/5, redondeado). Y 6*6 = 36 vueltas.

Entonces solo es cuestión de calcular la probabilidad de dar grandes pasos. Se pueden esperar empates alrededor de 3/51 de las veces (cuando juegas una carta, hay 3 cartas que pueden empatar de las otras 51 cartas). 48/51 = tamaño de paso 1, 3/51 * 46/49 = tamaño de paso 5, 3/51 * 3/49 * 44/47 = tamaño de paso 9, y así sucesivamente. Esto hace un tamaño de paso promedio de alrededor de 1,25. Se espera que un juego jugado con todos los pasos iguales a 1,25 dure alrededor de 21*21 = 441 turnos (26/1,25 = 21 cartas cada equivalente). Y luego reduzca eso un poco más para tener en cuenta la posibilidad de muerte súbita cuando uno de los empates ocurre cuando un jugador tiene pocas cartas. (Lo siento, no tengo los detalles sobre cómo hacer eso exactamente).

EDITAR: También debo enfatizar que este enfoque asume que los ensayos son ensayos independientes. Esa es básicamente la diferencia entre dados y cartas. Cada lanzamiento de un dado es independiente. Pero cada sorteo no lo es, depende de qué más se haya sorteado / qué más quede. Y en el caso de la Guerra, ganar una prueba en general mejora tus probabilidades en el K-ésimo sorteo siguiente (cuando vuelves a sacar esa carta). Es un efecto de líder fugitivo muy leve (OMI) (mitigado al recibir también la carta perdedora, pero sigo pensando que la red es una ganancia). Y multiplicará la ventaja, si la hay, otorgada a un jugador sobre el otro en el trato inicial. Es decir, cualquier ligera desviación hacia las cartas con números más altos en el reparto inicial se amplificará en cada recorrido sucesivo por la baraja.

Otras lecturas:

Paseo aleatorio simple: http://www2.math.uu.se/~sea/kurser/stokprocmn1/slumpvandring_eng.pdf

Primer pasaje de un caminante aleatorio unidimensional https://www.math.ucdavis.edu/~tracy/courses/math135A/UsefullCourseMaterial/firstPassage.pdf

Bueno, desde ese mismo enlace que compartiste, en la tabla de resumen a la derecha se lee:

Tiempo de juego 10–40 min.

Lo que dice directamente la duración media de un juego.

Ahora, los encendidos de este juego, según mi experiencia, son bastante rápidos. Pueden durar unos segundos (revelar cartas, alguien gana, se toman cartas, final del turno), o en caso de empate unos segundos más.

Entonces, suponiendo que un turno dura en promedio 10 segundos, podemos transformar esa duración promedio de unidades de tiempo a turnos. En el mejor de los casos (10 minutos) tardará 60 turnos en completarse, en el peor de los casos (40 minutos) tardará 240 turnos.

Quizás el OP pueda aclarar, pero interpreté la pregunta como una pregunta sobre probabilidad y estadísticas; ¿Cuál es el número promedio esperado de vueltas dados los factores que conocemos?
@GendoIkari sí, eso es lo que quise decir. Parece una respuesta más precisa que comenzar con un tiempo estimado e intentar inferir giros.
@GendoIkari Aunque mi enfoque no fue tan riguroso, es probabilístico. Tenemos la duración media de estos juegos. También podemos obtener una duración media del turno, en función de las dinámicas involucradas (que son bastante pocas, sacar cartas, mostrarlas, alguien gana, o empatar) y del conocimiento del dominio (haberlo jugado varias veces yo mismo)... pero sí. , esto podría ser más riguroso. Quizás hacer un pequeño programa que simule el juego dará una mejor estimación :)

Solo una respuesta rápida aquí, la guerra en realidad es un juego, porque la forma en que los jugadores recogen las cartas afecta el resultado. Puedes elegir recoger las cartas en diferentes órdenes después de cada ronda. Pero es muy difícil jugar estratégicamente.

En cuanto a la pregunta en cuestión, construí mi propia simulación y durante 5 intentos, con barajar, obtuve:

58, 144, 354, 428, 189

Esto llega a un promedio de 234 rondas. Obviamente, puedes hacer más intentos para obtener un número más preciso, ¡pero definitivamente es un juego largo para jugar!

mi código fuente es

<html>
<head>
<script>



window.addEventListener("load", () => goto(WAR));

    


// player decks and discards
let D1, D2, TABLE, ROUND;

function rank(x){
  let r = (x%13) + 1;
  if(r == 1) r = 14;
  return r;
}
function card(x){
  let r = rank(x);
  let suit = Math.floor(x/13);
  if(r > 10){
    r = ["Jack", "Queen", "King", "Ace"][r - 11]; }
  suit = ["Clubs", "Spades", "Hearts", "Diamonds"][suit];
  return `${r} of ${suit}`;
}
function deck(){
  return [...Array(52).keys()];
}
function shuffle(d){
  if(!d) d=deck();
  for(let i=0; i<d.length; ++i){
    let j = i + Math.floor((d.length-i) * Math.random());
    [d[i], d[j]] = [d[j], d[i]];
  }
  return d;
}

function draw(d,n,result){
  if(!d) d=deck();
  if(!n) n = 1;
  if(!result) result = [];
  n = Math.min(n, d.length);
  for(let i=0; i<n; ++i){
    result.push(d.shift()); }
  return result;
}

function ShowCounts(next){
  return next;
} 
    

function WAR(){
  D1 = shuffle();
  D2 = draw(D1, 26);
  console.log(D1, D2);
  TABLE = [];
  ROUND = 1;
  disp(`Welcome to War`);
  return WAIT;
}
function WAIT(){
  let handlers = [];
  more(`Press [Enter] or click anywhere to continue.`);
  wait(handlers, document.body, 'mousedown', null, FIGHT);
  wait(handlers, document.body, 'keydown', (e)=>(e.keyCode == 13), FIGHT);
  return null;
}
function FIGHT(){
  disp(`Fight! (Round ${ROUND++})`);
  more(`Player 1: ${D1.length} cards.`);
  more(`Player 2: ${D2.length} cards.`);
  more();
  if(D1.length == 0 || D2.length == 0) return END;
  let a = D1.shift();
  let b = D2.shift();
  TABLE.push(a);
  TABLE.push(b);
  more(`${card(a)} vs ${card(b)}.`);
  let x = rank(a);
  let y = rank(b);
  if(x == y){
    return TIE; }
  let winner = (x > y)? D1 : D2;
  more(`Player ${x>y? 1 : 2} wins ${TABLE.length} cards.`);
  draw(shuffle(TABLE), TABLE.length, winner);
  more();
  return WAIT;
}
function TIE(){
  more("Round is tied.");
  more("Each player draws 3 more facedown cards.");
  draw(D1, 3, TABLE);
  draw(D2, 3, TABLE);
  if(D1.length == 0 || D2.length == 0){
    return END; }
  return sleep(0.0, FIGHT);
}
function END(){
  if(D1.length > D2.length){
    disp("Player 1 Wins!"); }
  else{
    disp("Player 2 Wins!"); }
  more(`After ${ROUND} rounds.`);
  return RESTART;
}

function RESTART(){
  return sleep(2.5, ()=>{
    more("Restarting ...");
    sleep(2.5, WAR)})
}

function goto(target){ // targets return the next function to run.
  while(target){
    target = target(); }
}


function wait(handlers, target, name, test, after){
  if(!handlers) handlers = [];
  let handler = function(evt){
    if(test && !test(evt)) return;
    for(let tuple of handlers){
      let [other_target, other_name, other_handler] = tuple;
      other_target.removeEventListener(other_name, other_handler);
    }
    goto(after);
  }
  handlers.push([target, name, handler]);
  target.addEventListener(name, handler);
  return null;
}

function sleep(n, after){
    setTimeout(()=>goto(after), n*1000);
    return null;
}

function disp(x){
  if(x == undefined) x = "";
  document.getElementById("disptext").innerHTML = x;
}
function more(x){
  if(x == undefined) x = "";
  document.getElementById("disptext").innerHTML += "\n" + x;
}
  
function randint(n){
  return Math.floor(Math.random() * n);
}

function Download(){
  var zip = new JSZip();

  // Generate a directory within the Zip file structure
  var guessgame = zip.folder("war");

  guessgame.file("index.html", document.documentElement.outerHTML);

  // Generate the zip file asynchronously
  zip.generateAsync({type:"blob"}).then(function(content){
      // Force down of the Zip file
      saveAs(content, "wargame.zip");
  });
}

</script>
<style>
 *{ font-size: 108%; font-family: monospace; }
 #editor{ height: 70%; width: 100%; overflow-x: scroll; }
</style>
</head>
<body>
  <p><pre id="disptext"></pre></p>
  <!--<input id='textinput' type='text'></input>
  <input id='okaybutton' type='button' value="ok"></input>-->
  <!-- <p style="position: fixed; bottom: 0px; right:8px; text-align: right;"> -->
  <p>
    <!-- <h3> Source Code </h3> -->
    <!--<button onclick="editor.innerHTML = document.documentElement.outerHTML; editor.style.display='block'"> View </button>-->
    <!--<button onclick="Download();"> Download Game</button>-->
  </p>
  <p>
    <textarea id='editor' wrap='off' style="display:none;" readonly="true"></textarea>
  </p>

</body>
</html>
El efecto de cómo recoges las cartas es extremadamente mínimo cuando se agrega barajar al juego, solo es significativo cuando las cartas se colocan en el orden en que se recogen en la parte inferior del mazo actual.\
Por lo que recuerdo cuando jugaba a la guerra, las cartas siempre se barajaban cuando se acababa el mazo de juego.
Si tiene un código en ejecución, ejecútelo 10 000 veces para generar un promedio preciso. 5 muestras son casi inútiles.