Tworzę grę, która po kolei przedstawia różne rodzaje łamigłówek. Wybieram każdą układankę z pseudolosowym numerem. Dla każdej układanki istnieje wiele odmian. Wybieram wariant z innym numerem pseudolosowym. I tak dalej.
Chodzi o to, że chociaż powoduje to prawie prawdziwą przypadkowość, to nie jest to, czego naprawdę chce gracz. Gracz zazwyczaj chce tego, co postrzega i określa jako losowy, ale tylko wtedy, gdy nie ma tendencji do powtarzania łamigłówek. Nie bardzo przypadkowe. Po prostu nieprzewidywalne.
Zastanawiając się nad tym, potrafię sobie wyobrazić, jak to zrobić. Na przykład tymczasowe wyeliminowanie ostatnich N wyborów ze zbioru możliwości podczas wybierania nowego wyboru. Lub przypisując każdemu wyborowi jednakowe prawdopodobieństwo, zmniejszając prawdopodobieństwo wyboru do zera przy wyborze, a następnie powoli zwiększając wszystkie prawdopodobieństwa z każdym wyborem.
Zakładam, że istnieje ustalony sposób na zrobienie tego, ale po prostu nie znam terminologii, więc nie mogę jej znaleźć. Ktoś wie? A może ktoś rozwiązał to w przyjemny sposób?
Odpowiedzi:
Jeśli masz skończoną liczbę zagadek, możesz:
EDYTOWAĆ
Nie wiedziałem o tym, ale przeglądanie SE uświadomiło mi, że jest to tak naprawdę znane jako „tasowanie torby”. Więcej informacji tutaj , tutaj lub tam .
EDYCJA 2
Klasyczny Knuth Shuffle idzie w ten sposób:
Steven Stadnicki słusznie zauważył w swoim komentarzu, że tego rodzaju rzeczy nie zapobiegają powtórzeniu się po przetasowaniu. Można to uwzględnić, dodając specjalną skrzynkę dla ostatniego elementu:
źródło
Wariant podejścia Lorancou: dla każdego rodzaju układanki zachowaj tablicę (potasowanych) numerów układanek; następnie za każdym razem, gdy trafisz w tego typu łamigłówkę, usuń kolejny numer z listy. na przykład załóżmy, że masz puzzle Sudoku, Picross i Kenken, każda z zagadkami # 1..6. Utworzyłbyś trzy przetasowane tablice liczb 1..6, po jednym dla każdego rodzaju układanki:
Teraz potasowałbyś typy puzzli, jak sugeruje Lorancu; powiedzmy, że się pojawi [Picross, Sudoku, Kenken]. Następnie za każdym razem, gdy trafisz łamigłówkę danego typu, użyj następnego numeru z „listy losowania”; ogólnie twoja prezentacja puzzli to [Sudoku # 5, Picross # 6, Kenken # 3, Sudoku # 6, Picross # 2, Kenken # 2, ...]
Jeśli nie chcesz utrzymywać łamigłówek w tej samej ogólnej kolejności za każdym razem przez pętlę, myślę, że najlepsza jest opcja „wybierz losowo, ignorując kilka ostatnich typów”. Istnieją sposoby, aby uczynić to nieco bardziej wydajnym; na przykład powiedzmy, że masz 20 rzeczy i chcesz zignorować ostatnie 5 wybranych. Następnie zamiast losowo wybierać liczbę 1..20 i „przewijać”, aż znajdziesz ją poza ostatnimi 5, zamiast tego po prostu wybierz liczbę 1..15 i przejdź przez różne rodzaje układanek, pomijając dowolny rodzaj układanki, który został wybrany (możesz to zrobić łatwo, utrzymując tablicę bitów zawierającą 5 ostatnio wybranych zagadek).
źródło