Estou fazendo um jogo que apresenta vários tipos diferentes de quebra-cabeças em sequência. Eu escolho cada quebra-cabeça com um número pseudo-aleatório. Para cada quebra-cabeça, há várias variações. Eu escolhi a variação com outro número pseudoaleatório. E assim por diante.
A questão é que, embora isso produza aleatoriedade quase verdadeira, não é isso que o jogador realmente deseja. O jogador normalmente quer o que eles percebem ser e se identifica como aleatório, mas apenas se não tender a repetir quebra-cabeças. Então, não é realmente aleatório. Apenas imprevisível.
Pensando bem, posso imaginar maneiras erradas de fazê-lo. Por exemplo, eliminar temporariamente as N opções mais recentes do conjunto de possibilidades ao selecionar uma nova opção. Ou atribuindo a cada escolha uma probabilidade igual, reduzindo a probabilidade de uma opção a zero na seleção e aumentando todas as probabilidades lentamente a cada seleção.
Suponho que exista uma maneira estabelecida de fazer isso, mas simplesmente não conheço a terminologia, portanto não consigo encontrá-la. Ninguem sabe? Ou alguém resolveu isso de uma maneira agradável?
Respostas:
Se você tiver um número finito de quebra-cabeças, poderá:
EDITAR
Eu não sabia disso, mas navegar pelo SE me fez perceber que isso é realmente conhecido como "shuffle bag". Mais algumas informações aqui , aqui ou ali .
EDIT 2
O Knuth Shuffle clássico é assim:
Steven Stadnicki apontou com razão em seu comentário que esse tipo de coisa não impede a repetição de uma remodelação. Uma maneira de levar isso em consideração é adicionar um caso especial para o último item:
fonte
Uma variante da abordagem de lorancou: para cada tipo de quebra-cabeça, mantenha uma variedade de números (embaralhados); toda vez que você acertar um quebra-cabeça desse tipo, tire o próximo número da lista. por exemplo, digamos que você tenha quebra-cabeças de Sudoku, Picross e Kenken, cada um com os quebra-cabeças # 1..6. Você criaria três matrizes embaralhadas dos números 1..6, uma para cada tipo de quebra-cabeça:
Agora, você embaralha os tipos de quebra-cabeça como sugere Lororu; digamos que aparece [Picross, Sudoku, Kenken]. Então, toda vez que você acertar um quebra-cabeça de um determinado tipo, use o próximo número em sua 'lista aleatória'; No geral, sua apresentação de quebra-cabeça seria [Sudoku # 5, Picross # 6, Kenken # 3, Sudoku # 6, Picross # 2, Kenken # 2, ...]
Se você não deseja manter os quebra-cabeças na mesma ordem geral de cada vez no ciclo, acho que sua opção 'escolher aleatoriamente, ignorando as últimas escolhas' é a melhor. Existem maneiras de tornar isso um pouco mais eficiente também; por exemplo, digamos que você tenha 20 itens e queira ignorar os últimos 5 escolhidos. Em vez de escolher aleatoriamente um número 1..20 e 'rolar novamente' até obter um fora dos últimos 5, basta escolher um número 1..15 e percorrer seus tipos de quebra-cabeças por muitas etapas, apenas pulando sobre qualquer tipo de quebra-cabeça que seja foi escolhido (você pode fazer isso facilmente mantendo um conjunto de bits que contém os últimos 5 quebra-cabeças escolhidos).
fonte