Mi simulación es mucho más sencilla (requiere mucha menos reflexión). Tengo $10$ bucles anidados (a,b,c,d,e,f,g,h,i,j). a va de $2$ a $6$ ya que la carta con el número más bajo sólo puede ser una de esas opciones. Cada bucle interno comienza en $1$ más que el bucle que se encuentra inmediatamente fuera de él. El límite superior de los bucles es $43$ para un, $44$ para b, ... $51$ para i, $52$ para j. Está funcionando ahora pero es lento y tendrá que funcionar durante la noche. Estoy almacenando los ganadores en una base de datos para poder estudiarlos más tarde. Compararé los resultados cuando el programa termine y comprobaré todas las respuestas en la base de datos para asegurarme de que realmente son iguales $1$ .
Mi programa hace una comprobación de que la suma de los recíprocos es igual a $1.00000000000000000$ ( $17$ ceros). Creo que ese es el límite de la precisión. Dudo que cualquier fallo cercano se trunque en el $18$ o un dígito decimal más alto y no ser un $1$ .
La verdad es que me sorprende que no se hayan reportado soluciones con la tarjeta más baja que es el 6.
Así que éste parece uno de esos problemas que sólo pueden resolverse prácticamente a través de ordenadores, no utilizando un método de papel y lápiz. Al menos no he visto ese tipo de solución presentada aquí todavía. Le daré más tiempo a la gente porque parece un problema difícil de resolver de esa manera.
$Update$ : Por alguna misteriosa razón, mi programa se perdió algunas soluciones como $5,6,8,9,10,12,15,18,20,24$ . Se confirma como un error de redondeo, por lo que necesito utilizar un método diferente en el que multiplico todos los a,b,c,d,e,f,g,h,i,j (todos los rangos de la tarjeta), establezco ese producto como p, y luego compruebo si (p/a+p/b+p/c+p/d+p/e+p/f+p/g+p/h+p/i+p/j) = p. De esta manera no hay fracciones decimales porque estoy garantizando que no habrá ningún resto en la división, ya que todos los rangos son factorizados, por lo tanto pueden ser factorizados. Tengo que volver a hacer esto, así que me llevará muchas más horas. Un ejemplo sencillo de cómo funciona este algoritmo es si tomamos sólo $4$ tarjetas ( $2$ , $4$ , $5$ y $20$ ). Sabemos que $1/2 + 1/4 + 1/5 + 1/20$ = $1$ . Para comprobarlo, multiplicamos $2*4*5*20$ y obtener $800$ . Ahora básicamente convertimos todos los recíprocos en $800$ en el denominador por lo que $1/2$ = $400/800 $ ... Los suman y (en este caso), si coinciden $800/800$ entonces son una solución.
$Update 2$ . También tengo $1431$ ahora con mi nuevo algoritmo. Simulando todas las posibilidades de $10$ cartas extraídas al azar de la baraja de $52$ pero con la primera tarjeta sólo $2,3,4$ o $5$ mi programa está mostrando alrededor de $7.6$ mil millones de combinaciones de tarjetas escaneadas. Así que ahora mi siguiente paso (ya que tengo la respuesta correcta, creo), es acelerar el algoritmo, ya que no es necesario comprobar todos los 7,6 mil millones de manos, ya que algunos pueden ser "cortocircuitado" (detenido antes de tiempo) cuz la suma es ya demasiado alto.
$Update 3$ . Puse algunos ajustes en mi programa para que no tenga que comprobar todo $7.6$ mil millones de manos. Básicamente, mantiene un total acumulado del recíproco para el número de cartas que se han visto hasta ahora en la mano. Si ya está en $1$ (o por encima), esa mano se abandona antes y se intenta la siguiente. Además, con el $10$ bucles anidados, compruebo en cada bucle si la suma acumulada superará $1$ si se añade el valor mínimo de los bucles interiores. Esto significaría que, independientemente de los valores de los bucles interiores, la suma de los recíprocos con cualquier combinación de las cartas restantes añadidas será superior a $1$ para que esa mano pueda ser abandonada también. Puedo hacer esto porque mis bucles anidados están ordenados de tal manera que cada bucle interno comienza en $1$ más alto que el bucle que se encuentra inmediatamente fuera de él.
Algunos ejemplos de abandono de una mano antes de tiempo (con fines ilustrativos).
Recuerda que mis bucles anidados se llaman a,b,c,d,e,f,g,h,i,j empezando por el más externo.
Primero una fácil. $2,3,4$ d,e,f,g,h,i,j. Podemos abandonar esta mano ya que $1/2 + 1/3 + 1/4$ ya es más que $1$ así que no nos importa lo que son d,e,f,g,h,i y j, así que nos saltamos todos esos e intentamos $2,3,5$ ,d,e,f,g,h,i,j pero que también es más que $1$ ( $1/2+1/3+1/5$ ) por lo que abandonamos todos los $2,3,5$ combinaciones...
La segunda comprobación que hago para abandonar una mano es cuando la suma acumulada hasta el momento se acerca a $1$ (como $0.97619$ ) como es el caso cuando a,b,c (los más externos $3$ bucles) son $2,3,7$ . Eso da $1/2$ + $1/3$ + $1/7$ = $0.97619$ .... No hay manera $2,3,7$ puede ser parte de una solución ya que el resto $7$ tarjetas (como mínimo) contribuiría $1/46$ , $1/47$ , $1/48$ ... $1/52$ . Así que mi programa comprueba esto y ni siquiera termina el $10$ mano de la tarjeta en casos como éste.
$Update - 4$ . Pongo otro cheque para acelerar el programa. Compruebo el caso en que en cada bucle anidado, la suma de los recíprocos de las cartas restantes no puede sumar 1 porque incluso con el valor máximo del recíproco de los rangos de las cartas restantes, la suma será demasiado baja (por debajo de $1$ ). Este ajuste mejoró enormemente la velocidad de ejecución del programa interpretado. El simple hecho de recorrer en bucle todos los $7.9$ mil millones de combinaciones de cartas llevó mucho tiempo $10$ horas más o menos (durante la noche). Con la "mano abandonada" comprueba si es demasiado alta (por encima de $1$ ) o demasiado bajo (por debajo de $1$ ) antes de comprobar si es igual a $1$ Pude conseguir que el programa se redujera a sólo $4.5$ minutos de ejecución (más de $100$ veces más rápido corriendo). Además, sólo alrededor de $73$ millones de manos se verificaron realmente para la igualdad a $1$ . La salida en mi pantalla es divertido ver cuz lo que solía arrastrarse como todos $7.9$ mil millones de manos se revisaron ahora "rasgaduras" como sobre sólo $1$ en $100$ manos (en comparación con las anteriores) ahora se comprueban.
$Update-5$ Con la ayuda de la lista de exclusión, mi casi $200$ líneas de código interpretado se ejecutan en $6.7$ segundos. Un agradecimiento especial a todos los que han participado en la elaboración de esta lista de exclusión. El programa original no optimizado solía tardar unos $10$ horas que es $36,000$ segundos. El programa altamente optimizado ahora sólo tarda $6.7$ segundos que es más que $5000$ veces más rápido para obtener la misma respuesta correcta de $1431$ . Todavía es posible que haya algunas optimizaciones más. ¿Quizás la lista de exclusión no esté completa?
0 votos
¿Qué has probado?
0 votos
Interesante pregunta... ¿Está seguro de que la probabilidad no es cero?
0 votos
Sí, ya tengo una solución que funciona, pero no sé cuántos de 52 eligen 10, así que todavía no puedo calcular la probabilidad. Si usted encuentra esta pregunta interesante por favor upvote / favorito.
0 votos
Aparte de una simulación informática exhaustiva de miles de millones de combinaciones, no sé cómo resolver esto matemáticamente, pero me gustaría saberlo. Otro problema de la simulación es el error de redondeo. Comprobaré mi única solución para asegurarme de que es realmente una solución válida, pero en mi hoja de cálculo de Excel con 17 dígitos de precisión decimal, está mostrando exactamente 1. Es decir, 1.00000000000000000.
1 votos
Por favor, comparta su solución, podemos probarla fácilmente.
0 votos
5,6,7,8,9,10,12,40,42,45 es mi 1 solución. Me gustaría saber cuántos de 16 mil millones hay para poder calcular la probabilidad con exactitud. Me encontré con esta respuesta mediante la ejecución de una simulación por ordenador de todas las manos de 10 cartas, pero a partir de 5 y mi programa me dijo que esta solución muy rápidamente. El número de manos puede ser recortado / podado mucho ya que sabemos que la tarjeta 1 no puede ser un candidato, ya que 1 / 1 ya es la suma de 1. También podemos recortar a partir de cualquier tarjeta más alta que 10, ya que es sólo 0,1 y cualquier tarjeta de mayor rango (como 11) no se suman lo suficiente para llegar a 1.
1 votos
En efecto, $\frac{504+420+360+315+280+252+210+63+60+56}{2520}=1$ Me has convencido de hacer un esfuerzo...
0 votos
Sí, es bastante fácil encontrar soluciones individuales, pero ¿cómo podemos mostrar matemáticamente todas las soluciones y así calcular la probabilidad? Tengo que ejecutar mi simulación durante toda la noche para obtener la respuesta e incluso entonces no estaré 100% seguro de que es correcta.
0 votos
@David dudo de una ruptura matemática
2 votos
Deberías hacer cálculos como este usando enteros, no flotantes. Python tiene una clase racional que puede operar con ellos o puedes almacenar el numerador y el denominador. Así tus cálculos serán exactos y no te engañarás por estar cerca.
0 votos
Mi algoritmo revisado en el que multiplico todos los rangos para obtener un denominador común y luego convierto todos los recíprocos de los rangos (por ejemplo 1/2, 1/5...) a ese denominador común, y luego los sumo todos para comprobar si son iguales a 1 parece funcionar bien. Son fracciones pero siempre con numeradores enteros (y un denominador muy grande). El ejemplo sencillo que di es si quieres comprobar si 4 cartas (rangos) tienen recíprocos que suman 1. Las 4 cartas son 2, 4, 5 y 20. Multiplique todas ellas y obtenga 800 como nuevo denominador. El rango 2 es entonces igual a 400/800, el rango 4 es 200/800... entonces súmalos.
0 votos
En realidad, como conozco el denominador (800 en el ejemplo sencillo), sólo tengo que multiplicar cada recíproco (1/2, 1/5...) por el 800 y luego sumar sólo los nuevos numeradores y comprobar si son iguales a 800. En realidad, el nuevo denominador será un número mucho mayor para 10 cartas, siendo algunas de alto rango (como 45). Por ejemplo, una solución válida es 5,6,7,8,9,10,12,40,42,45. Esos 10 números se multiplican por 137.168.640.000. Incluso el rango más alto (45) se convierte en un nuevo numerador grande de 3.048.192.000.