Jugador 1 sale mixto (X:N), jugador 2 con 5 piedras del mismo palo (Y) , pero ninguno de estos palos coincide con los palos de la salida mixta
Escenario
Condiciones de este escenario:
Jugador 1 sale mixto (X:N)
Jugador 2 con 5 piedras del mismo palo (Y)
J2 no tiene ni X:Y ni N:Y
Resultados
Este caso en particular por ser de mucho interés se corrió 1680 con un resultado de 48/1680 = 2,85%
Código python
def deal_dominoes(num_players=3, stones_per_player=7):
"""
Baraja un set completo de dominó y reparte las piedras a los jugadores.
Devuelve una lista de manos, donde cada mano es una lista de dominós.
"""
dominoes = create_domino_set()
random.shuffle(dominoes)
hands = []
for _ in range(num_players):
# Asegurarse de que haya suficientes dominós para repartir
if len(dominoes) < stones_per_player:
raise ValueError("No hay suficientes dominós para repartir a todos los jugadores.")
hand = [dominoes.pop() for _ in range(stones_per_player)]
hands.append(hand)
return hands
# 3. Condición del Jugador 1: tiene una piedra mixta (X:N, donde X != N)
# Se asume que 'sale mixto' significa que su mano contiene al menos una piedra mixta
# y se toma la primera encontrada para identificar X y N.
def check_p1_mixed_start(p1_hand):
"""
Verifica si la mano del Jugador 1 contiene al menos un dominó mixto (X:N donde X != N).
Si lo encuentra, devuelve True y los valores X y N de una de esas piedras.
De lo contrario, devuelve False, None, None.
"""
for d in p1_hand:
if d[0] != d[1]: # Es una piedra mixta
return True, d[0], d[1] # Devuelve el primer dominó mixto encontrado y sus valores
return False, None, None
# 4. Condición del Jugador 2: tiene 5 piedras del mismo palo (Y)
def check_p2_dominant_suit(p2_hand):
"""
Verifica si la mano del Jugador 2 contiene al menos 5 dominós que incluyen un palo específico (Y).
Si lo encuentra, devuelve True y el palo dominante Y.
De lo contrario, devuelve False, None.
"""
# Para cada posible palo (0-6), cuenta cuántas piedras en la mano contienen ese palo
for suit_candidate in range(7):
stones_with_suit_y = 0
for domino in p2_hand:
if suit_candidate in domino: # Si el palo candidato está en el dominó
stones_with_suit_y += 1
if stones_with_suit_y >= 5:
return True, suit_candidate # Retorna el primer palo dominante encontrado
return False, None
# 5. Condición de exclusión: el palo dominante Y del J2 no coincide con los palos X o N de la salida mixta del J1
def check_exclusion(p1_val1, p1_val2, p2_suit_y):
"""
Verifica si el palo dominante Y del Jugador 2 es diferente de ambos valores
(X y N) de la piedra mixta inicial del Jugador 1.
"""
return p2_suit_y != p1_val1 and p2_suit_y != p1_val2
# --- Configuración y ejecución de la simulación ---
NUM_SIMULATIONS = 1680
successful_scenarios = 0
print(f"Iniciando {NUM_SIMULATIONS} simulaciones de dominó...")
for i in range(NUM_SIMULATIONS):
# Repartir las manos
hands = deal_dominoes(num_players=3, stones_per_player=7)
p1_hand = hands[0]
p2_hand = hands[1]
# Verificar la condición del Jugador 1
p1_condition_met, p1_val1, p1_val2 = check_p1_mixed_start(p1_hand)
if not p1_condition_met:
continue # Si P1 no tiene una piedra mixta, esta simulación no cumple
# Verificar la condición del Jugador 2
p2_condition_met, p2_suit_y = check_p2_dominant_suit(p2_hand)
if not p2_condition_met:
continue # Si P2 no tiene 5 piedras del mismo palo, esta simulación no cumple
# Verificar la condición de exclusión
if check_exclusion(p1_val1, p1_val2, p2_suit_y):
successful_scenarios += 1 # Si todas las condiciones se cumplen, contamos el escenario
print(f"\nDe un total de {NUM_SIMULATIONS} simulaciones, el escenario especificado ocurrió {successful_scenarios} veces.")
Comments
Post a Comment