Estoy haciendo un juego que presenta varios tipos diferentes de rompecabezas en secuencia. Elijo cada rompecabezas con un número pseudoaleatorio. Para cada rompecabezas, hay una serie de variaciones. Elijo la variación con otro número pseudoaleatorio. Y así.
La cuestión es que, si bien esto produce una aleatoriedad casi verdadera, esto no es lo que el jugador realmente quiere. El jugador normalmente quiere lo que percibe e identifica como aleatorio, pero solo si no tiende a repetir acertijos. Entonces, no realmente al azar. Simplemente impredecible.
Al pensarlo un poco, me imagino formas extrañas de hacerlo. Por ejemplo, eliminar temporalmente las N opciones más recientes del conjunto de posibilidades al seleccionar una nueva opción. O asignando a cada opción una probabilidad igual, reduciendo la probabilidad de una opción a cero en la selección, y luego aumentando todas las probabilidades lentamente con cada selección.
Supongo que hay una forma establecida de hacer esto, pero simplemente no conozco la terminología, así que no puedo encontrarla. ¿Nadie sabe? ¿O alguien ha resuelto esto de una manera agradable?
Respuestas:
Si tienes un número finito de rompecabezas, puedes:
EDITAR
No sabía esto, pero navegar por SE me hizo darme cuenta de que esto en realidad se conoce como una "bolsa aleatoria". Algunas informaciones más aquí , aquí o allá .
EDITAR 2
El clásico Knuth Shuffle dice lo siguiente:
Steven Stadnicki señaló acertadamente en su comentario que este tipo de cosas no evita la repetición en una reorganización. Una forma de tener esto en cuenta es agregar un caso especial para el último elemento:
fuente
Una variante en el enfoque de lorancou: para cada tipo de rompecabezas, mantenga una serie de números de rompecabezas (barajados); luego, cada vez que juegues un rompecabezas de ese tipo, saca el siguiente número de la lista. por ejemplo, digamos que tienes rompecabezas Sudoku, Picross y Kenken, cada uno con los rompecabezas # 1..6. Crearía tres conjuntos aleatorios de los números 1..6, uno para cada tipo de rompecabezas:
Ahora, barajarías los tipos de rompecabezas como sugiere lorancu; digamos que aparece [Picross, Sudoku, Kenken]. Luego, cada vez que juegues un rompecabezas de un tipo dado, usa el siguiente número en su 'lista aleatoria'; en general, su presentación de rompecabezas sería [Sudoku # 5, Picross # 6, Kenken # 3, Sudoku # 6, Picross # 2, Kenken # 2, ...]
Si no desea mantener los acertijos en el mismo orden general cada vez a través del ciclo, entonces creo que su opción 'elegir al azar, ignorando las últimas selecciones' es la mejor. También hay maneras de hacer esto un poco más eficiente; por ejemplo, digamos que tienes 20 cosas y quieres ignorar las últimas 5 elegidas. Luego, en lugar de elegir aleatoriamente un número 1..20 y 'rebobinar' hasta obtener uno fuera de los últimos 5, en su lugar, elija un número 1..15 y recorra sus tipos de acertijos tantos pasos, simplemente salteando cualquier tipo de acertijo que sea elegido (puede hacer esto fácilmente manteniendo una matriz de bits que contenga los últimos 5 rompecabezas seleccionados).
fuente