Suponga que tiene una bolsa con fichas, cada una con una letra. Hay mosaicos con la letra 'A', con 'B', etc., y 'comodín' (tenemos ). Suponga que tiene un diccionario con un número finito de palabras.
Eliges fichas de la bolsa sin reemplazo.
¿Cómo calcularías (o estimarías) la probabilidad de que puedas formar una palabra dada, de longitud (con 1 < = < ) del diccionario dadas las fichas seleccionadas?
Para aquellos que no están familiarizados con Scrabble (TM), el carácter comodín se puede utilizar para que coincida con cualquier letra. Por lo tanto, la palabra 'BOOT' podría ser 'deletreada' con los mosaicos 'B', '*', 'O', 'T'. El orden en que se dibujan las letras no importa.
Sugerencia: para simplificar la escritura de respuestas, podría ser mejor simplemente responder la pregunta: ¿cuál es la probabilidad de tener la palabra 'BOOT' entre sus posibles movimientos después de sacar 7 letras de una bolsa nueva?
(La introducción del problema se ha copiado de esta pregunta similar )
fuente
Respuestas:
Se solicita una fórmula . Desafortunadamente, la situación es tan complicada que parece que cualquier fórmula será simplemente una forma indirecta de enumerar todas las posibilidades. En cambio, esta respuesta ofrece un algoritmo que es (a) equivalente a una fórmula que involucra sumas de productos de coeficientes binomiales y (b) puede ser portado a muchas plataformas.
Para obtener dicha fórmula, divida las posibilidades en grupos mutuamente disjuntos de dos maneras: de acuerdo con la cantidad de letras que no están en la palabra seleccionadas en el estante (deje que esto sea ) y de acuerdo con la cantidad de comodines (espacios en blanco) seleccionados ( deja que esto sea w ). Cuando hay r = 7 mosaicos en el estante, N mosaicos disponibles, M mosaicos disponibles con letras que no están en la palabra y W = 2 espacios en blanco disponibles, el número de opciones posibles dadas por ( m , w ) esm w r=7 N M W=2 (m,w)
porque las opciones de letras que no son palabras, espacios en blanco y letras de palabras son independientes condicional en(m,w,r).
Esto reduce el problema de encontrar la cantidad de formas de deletrear una palabra cuando se selecciona solo de los mosaicos que representan las letras de la palabra, dado que espacios en blanco están disponibles y se mosaicos . La situación es desordenada y no hay una fórmula cerrada disponible. Por ejemplo, con espacios en blanco y letras extrañas se dibujan exactamente cuatro letras restantes para deletrear "boot" que se extrajeron de los mosaicos "b", "o" y "t" . Dado que hay "b" 's, "o"' s, yr - m - w w = 0 m = 3 2 8 6w r−m−w w=0 m=3 2 8 6 "t" en el conjunto de mosaicos Scrabble, hay probabilidades positivas de dibujar (bisetos) "bboo", "bbot", "bbtt", "booo", "boot", "bott", "bttt", "oooo "," ooot "," oott "," ottt "y" tttt ", pero solo uno de estos hechizos" boot ". ¡Y ese fue el caso fácil! Por ejemplo, suponiendo que el estante contenga cinco fichas elegidas al azar de las fichas "o", "b" y "t", junto con ambos espacios en blanco, hay muchas más formas de deletrear "arranque" y no deletrearlo. Por ejemplo, "boot" se puede escribir desde "__boott" y "__bbttt", pero no desde "__ttttt".
Este conteo, el corazón del problema, se puede manejar de manera recursiva. Lo describiré con un ejemplo. Supongamos que deseamos contar las formas de deletrear "boot" con un espacio en blanco y cuatro mosaicos más de la colección de mosaicos "b", "o" y "t" (de donde los dos mosaicos restantes muestran letras no en blanco que no están en { "b", "o", "t"}). Considere la primera letra, "b":
Se puede dibujar una "b" en formas de los dos mosaicos "b" disponibles. Esto reduce el problema a contar la cantidad de formas de deletrear el sufijo "oot" usando ambos espacios en blanco y solo tres fichas más de la colección de fichas "o" y "t".(21)
Un espacio en blanco puede designarse como una "b". Esto reduce el problema a contar la cantidad de formas de deletrear "oot" usando el espacio en blanco restante y solo tres mosaicos más de la colección de mosaicos "o" y "t".
En general, los pasos (1) y (2), que son disjuntos y, por lo tanto, contribuyen de manera aditiva a los cálculos de probabilidad, pueden implementarse como un bucle sobre el posible número de espacios en blanco que podrían usarse para la primera letra. El problema reducido se resuelve de forma recursiva. El caso base ocurre cuando queda una letra, hay una cierta cantidad de mosaicos con esa letra disponible, y también puede haber algunos espacios en blanco en el estante. Solo tenemos que asegurarnos de que el número de espacios en blanco en el estante más el número de mosaicos disponibles será suficiente para obtener la cantidad deseada de esa última letra.
Aquí hay un7
R
código para el paso recursivo.rack
generalmente es igual a , es un conjunto de recuentos de las letras (como ), es una estructura similar que da el número de mosaicos disponibles con esas letras, y es el número de espacios en blanco que se supone que ocurren en el bastidor.word
c(b=1, o=2, t=1)
alphabet
wild
Una interfaz para esta función especifica los mosaicos estándar de Scrabble, convierte una palabra dada en su estructura de datos de múltiples conjuntos y realiza la suma doble sobre y . Aquí es donde se calculan y multiplican los coeficientes binomiales y .w ( Mm w ( W(Mm) (Ww)
Probemos esta solución y cronometremos a medida que avanzamos. La siguiente prueba utiliza las mismas entradas empleadas en las simulaciones de @Rasmus Bååth :
Esta máquina reporta segundos de tiempo total transcurrido: razonablemente rápido. ¿Los resultados?0.05
La probabilidad de "arranque" de es exactamente igual al valor obtenido en mi otra respuesta (que utiliza un método similar pero lo formula en un marco más potente que requiere una plataforma de computación de álgebra simbólica). Las probabilidades para las cuatro palabras son razonablemente cercanas a las simulaciones de Bååth (que no podría esperarse que proporcione un valor exacto para "zoología" debido a su baja probabilidad de que es menos de uno en un millón).2381831 / 333490850 11840 / 16007560800 ,114327888/16007560800 2381831/333490850 11840/16007560800,
fuente
R
pero aun así logré usar sus funciones en menos de una hora de trabajo, de modo que el script toma información de un archivo de diccionario de 20k palabras y escribe resultados en un .csv. (Esto tomó menos de 10 minutos en un Core i5 de rango medio)Las respuestas a la pregunta a la que se hace referencia se aplican aquí directamente: cree un diccionario que consista solo en la palabra objetivo (y sus posibles deletreos comodín), calcule la posibilidad de que un estante aleatorio no pueda formar el objetivo y reste eso de . Este cálculo es rápido.1
Las simulaciones (que se muestran al final) admiten las respuestas calculadas.
Detalles
Como en la respuesta anterior, Mathematica se usa para realizar los cálculos.
Especifique el problema: la palabra (o palabras, si lo desea), las letras, sus recuentos y el tamaño del estante. Debido a que todas las letras que no están en la palabra actúan de la misma manera, acelera enormemente el cálculo para reemplazarlas por un solo símbolo representa "cualquier letra que no esté en la palabra".χ
Cree un diccionario de esta palabra (o palabras) y aumente para incluir todas las posibles ortografías comodín.
Calcule las no palabras:
(Hay no palabras en este caso).185
Calcule las posibilidades. Para el muestreo con reemplazo, simplemente sustituya los recuentos de mosaico por las variables:
Este valor es aproximadamente0.00756036.
Para el muestreo sin reemplazo, use potencias factoriales en lugar de potencias:
Este valor es aproximadamente Los cálculos fueron prácticamente instantáneos.0.00714212.
Resultados de la simulación
Resultados de iteraciones con reemplazo:106
Compárelo con el valor calculado en relación con su error estándar:
El acuerdo está bien, apoyando firmemente el resultado calculado.
Resultados de iteraciones sin reemplazo:106
Haz la comparación:
El acuerdo en esta simulación fue excelente.
El tiempo total para la simulación fue de segundos.12
fuente
Entonces, esta es una solución de Monte Carlo , es decir, vamos a simular dibujar los mosaicos un millón de veces y luego vamos a calcular cuántos de estos dibujos simulados resultaron en que podamos formar la palabra dada. He escrito la solución en R, pero puedes usar cualquier otro lenguaje de programación, como Python o Ruby.
Primero voy a describir cómo simular un sorteo. Primero definamos las frecuencias de mosaico.
Luego codifique la palabra como un vector de recuento de letras.
Ahora dibuje una muestra de siete mosaicos y codifíquelos de la misma manera que la palabra.
Por fin, calcule qué letras faltan ...
... y suma el número de letras que faltan y resta el número de espacios en blanco disponibles. Si el resultado es cero o menos, logramos deletrear la palabra.
En este caso particular, no lo hicimos ... Ahora solo tenemos que repetir esto muchas veces y calcular el porcentaje de sorteos exitosos. Todo esto se realiza mediante la siguiente función R:
Aquí
reps
está el número de sorteos simulados. Ahora podemos probarlo con varias palabras diferentes.fuente
sample
no actúa como parece esperar. Por ejemplo, ¿qué sucede con su código si el juego se modifica para permitir un estante de 28 fichas? Cambiasize=7
asize=28
para descubrirlo.fuente
Meh
Ha pasado un tiempo desde que vi cómo construí mi proyecto. Y mis matemáticas pueden ser completamente incorrectas a continuación, o correctas. Puedo tenerlo al revés. Sinceramente, lo olvido. ¡PERO! Usando solo una combinación binomial, sin tener en cuenta los mosaicos en blanco que arrojan todo fuera de control. La solución de combinación simple sin comodín.
Yo mismo hice estas preguntas y por eso construí mi propio diccionario de probabilidad de palabras de scrabble . No necesita un diccionario de posibles palabras extraídas, solo las matemáticas detrás de él y las letras disponibles basadas en letras en una bolsa de azulejos. El conjunto de reglas en inglés está abajo. Pasé semanas desarrollando las matemáticas solo para responder esta pregunta para todas las palabras en inglés que se pueden usar en un juego, incluidas las palabras que no se pueden usar en un juego. Todo puede ser incorrecto.
La probabilidad de sacar una palabra dada de una bolsa de letras en Scrabble, requiere cuántas letras están disponibles en la bolsa, para cada letra (AZ) y, si estamos usando el comodín como una adición a las matemáticas. Las fichas en blanco se incluyen en esta matemática, suponiendo 100 fichas, 2 de las cuales están en blanco. Además, la cantidad de fichas disponibles varía según el idioma del juego y las reglas del juego de todo el mundo. El scrabble inglés difiere del scrabble árabe, obviamente. Simplemente modifique las letras disponibles, y las matemáticas deberían hacer el trabajo.
Si alguien encuentra errores, me aseguraré de actualizarlos y resolverlos.
Arranque : La probabilidad de Arranque en un juego de scrabble es 0.000386%, que es una probabilidad de 67 de 173,758 manos como se muestra en la página de palabras para arranque .
Azulejos ingleses
todo es el conjunto de letras en la bolsa. count es la matriz de mosaicos disponibles para esa letra, y point es el valor en puntos de la letra.
Hay 100 fichas en un juego de scrabble en inglés (es decir, la suma de
$count
). No importa cómo se tomen las fichas, por lo que no es una permutación.Las matemáticas que utilicé Determine cuántas letras hay en la palabra y qué letras hay en la palabra, cuántas de esas letras están disponibles en la bolsa de fichas (cuente para cada letra, únicas y todas). Coeficiente binomial de cada uno, dividido por el coeficiente binomial de longitud de palabra.
Determinar las combinaciones binomiales disponibles.
Para cada letra, cuál es el coeficiente binomial.
Hay 1 "B". Hay 2 disponibles, un 2% de posibilidades de sacar el b.
Hay 2 "O". Hay 8 disponibles, un 8% de posibilidades de tirar de la o.
Hay 1 "T". Hay 6 disponibles, un 6% de posibilidades de tirar de la t.
BOOT es una palabra de 4 letras, tomada de un conjunto de 100 fichas con espacios en blanco, 98 sin ellas.
n = 98. El número de mosaicos sin espacio en blanco en el conjunto de inglés
fuente
R
R
let <- c(rep("b", 2), rep("o", 8), rep("t", 6), rep("_", 84)); boot <- function(x) sum(x=="b")>=1 && sum(x=="o")>=2 && sum(x=="t")>=1; mean(replicate(1e5, boot(sample(let, 7))))