Psuedo-Random Traversal de um conjunto

Eu tenho lidoCodificação de Jogo Completa (4ª Edição) e estou tendo alguns problemas para entender o caminho "Travessia Pseudo-Random de um Conjunto" na seção "Retirar Sacola de Itens Úteis" no Capítulo 3.

Alguma vez você já se perguntou como funciona o botão “aleatório” no seu CD player? Ele tocará todas as músicas do seu CD aleatoriamente sem tocar a mesma música duas vezes. Essa é uma solução realmente útil para garantir que os jogadores em seus jogos vejam a maior variedade de recursos, como objetos, efeitos ou personagens, antes de terem a chance de ver os mesmos novamente.

Após essa descrição, ele continua falando sobre uma implementação em C ++ que tentei implementar em Java, mas não consegui replicar com êxito. Ele também descreve brevemente como funciona, mas eu também não entendo.

eu encontreiisto O StackOverflow responde a uma pergunta semelhante, mas infelizmente o link para exemplos na resposta está morto e eu também não entendo o artigo da Wikipedia, embora a descrição sobre o que ele faz parece descrever o que estou procurando.

Para ser claro, eu sounão procurando uma maneira de reordenar aleatoriamente uma coleção. Eu estou procurando uma maneira de selecionar aleatoriamente um elemento de uma coleção exatamente uma vez antes de repetir.

Alguém pode explicar como esse comportamento funciona e fornecer um exemplo em Java? Obrigado!

[EDITAR] Achei que seria útil ter um trecho da implementação aqui para ajudar a explicar do que estou falando.

Veja como isso funciona. Um valor de salto é calculado escolhendo três valores aleatórios maiores que zero. Esses valores se tornam os coeficientes da quadrática e o valor do domínio (x) é definido como o valor ordinal do conjunto:

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

Armado com esse valor de salto, você pode usar esse trecho de código para percorrer todo o conjunto exatamente uma vez, em uma ordem pseudoaleatória:

nextMember += skip;
nextMember %= prime;

O valor de pulo é muito maior do que o número de membros do seu conjunto que o valor escolhido parece pular aleatoriamente. Naturalmente, esse código está dentro de um loop while para capturar o caso em que o valor escolhido é maior que o seu conjunto, mas ainda menor que o número primo.

questionAnswers(5)

yourAnswerToTheQuestion