Psuedo-aleatorio de un conjunto

He estado leyendoCodificación del juego completa (4ª edición) y tengo algunos problemas para entender la ruta "Travesía pseudoaleatoria de un conjunto" en la sección "Bolsa de cosas útiles" en el Capítulo 3.

¿Alguna vez te has preguntado cómo funciona el botón "aleatorio" en tu reproductor de CD? Reproducirá aleatoriamente todas las canciones de su CD sin reproducir la misma canción dos veces. Esa es una solución realmente útil para asegurarse de que los jugadores en sus juegos vean la variedad más amplia de características como objetos, efectos o personajes antes de que tengan la oportunidad de ver los mismos otra vez.

Después de esta descripción, se habla de una implementación en C ++ que he intentado implementar en Java, pero que no he podido replicar correctamente. También describe brevemente cómo funciona, pero tampoco lo entiendo.

encontréesta StackOverflow responde a una pregunta similar, pero desafortunadamente el enlace a los ejemplos en la respuesta está muerto y tampoco entiendo el artículo de Wikipedia, aunque la descripción de lo que hace parece describir lo que estoy buscando.

Para ser claros, estoyno Buscando una manera de reordenar aleatoriamente una colección. Estoy buscando una forma de seleccionar aleatoriamente un elemento de una colección exactamente una vez antes de repetir.

¿Alguien puede explicar cómo funciona este comportamiento y proporcionar un ejemplo en Java? ¡Gracias!

[EDITAR] Me di cuenta de que podría ser útil tener un extracto de la implementación aquí para ayudar a explicar de qué estoy hablando.

Así es como funciona. Un valor de salto se calcula eligiendo tres valores aleatorios mayores que cero. Estos valores se convierten en los coeficientes de la cuadrática, y el valor del dominio (x) se establece en el valor ordinal del conjunto:

Skip = RandomA * (members * members) + (RandomB * members) + RandomC

Armado con este valor de salto, puede usar este fragmento de código para recorrer todo el conjunto exactamente una vez, en un orden pseudoaleatorio:

nextMember += skip;
nextMember %= prime;

El valor de omisión es mucho mayor que el número de miembros de tu conjunto que el valor elegido parece saltar al azar. Por supuesto, este código está dentro de un bucle while para detectar el caso en el que el valor elegido es más grande que su conjunto pero aún más pequeño que el número primo.

Respuestas a la pregunta(5)

Su respuesta a la pregunta