Obecnie mam do czynienia z systemem walki wieloosobowej, w którym obrażenia zadawane przez graczy są zawsze mnożone przez losowy współczynnik od 0,8 do 1,2.
Teoretycznie prawdziwie losowy RNG może ostatecznie uzyskać tę samą liczbę wiele razy (patrz dylemat Tetris ). Może to doprowadzić do meczu, w którym gracz zawsze zadaje bardzo duże obrażenia, podczas gdy drugi zawsze zadaje bardzo niskie obrażenia.
Co mogę zrobić, aby upewnić się, że tak się nie stanie? Czy niektóre RNG są lepsze od innych w unikaniu powtórzeń?
algorithm
multiplayer
random
Użytkownik nie znaleziony
źródło
źródło
Odpowiedzi:
Możesz rozwiązać to w ten sam sposób, w jaki robi to Tetris, tworząc wstępnie ustaloną listę wyników obrażeń i przetasowania.
Powiedzmy, że wiesz, że gracz zada liniowe obrażenia o wartości od 0,8x do 1,2x. Weź listę [0,8, 0,9, 1,0, 1,1, 1,2]. Potasuj losowo , aby uzyskać np. [1.2, 1.0, 0.8, 0.9, 1.1].
Za pierwszym razem, gdy gracz zadaje obrażenia, zadaje 1,2x. Następnie 1x. Następnie itd. Do 1,1x. Tylko gdy tablica jest pusta, należy wygenerować i przetasować nową tablicę.
W praktyce prawdopodobnie zechcesz to zrobić jednocześnie dla ponad 4 tablic (np. Zacznij od [0,8,0.8,0.8,0.8,0.9,0.9,0.9,0.9, ...]). W przeciwnym razie okres sekwencji jest wystarczająco krótki, aby gracze mogli dowiedzieć się, czy ich kolejne trafienie jest „dobre”, czy nie. (Chociaż może to również dodać więcej strategii do walki, jak w tabeli Hoimi Dragon Quest IX , w której ludzie wymyślili, jak sondować, patrząc na leczące liczby i modyfikować, dopóki nie zagwarantujesz rzadkiego spadku.)
źródło
Napisałem do tego kod . Istotą tego jest używanie statystyk do korygowania pechowych serii. Możesz to zrobić, aby śledzić, ile razy zdarzenie miało miejsce, i użyć go do odchylenia liczby wygenerowanej przez PRNG.
Po pierwsze, w jaki sposób śledzimy procent zdarzeń? Naiwnym sposobem na to byłoby zachowanie wszystkich liczb kiedykolwiek wygenerowanych w pamięci i uśrednienie ich: co by działało, ale jest okropnie nieefektywne. Po krótkiej refleksji wpadłem na następujące (które są w zasadzie skumulowaną średnią ruchomą ).
Weź następujące próbki PRNG (gdzie wykonujemy, jeśli próbka jest> = 0,5):
Zauważ, że każda wartość przyczynia się do 1/5 wyniku końcowego. Spójrzmy na to z innej strony:
Zauważ, że
0
przyczynia się do 50% wartości i1
przyczynia się do 50% wartości. Posunięto się nieco dalej:Teraz pierwsze wartości stanowią 66% wartości, a ostatnie 33%. Możemy zasadniczo sprowadzić to do następującego procesu:
Teraz musimy przesunąć wynik wartości próbkowanej z PRNG, ponieważ wybieramy procentową szansę, tutaj rzeczy są znacznie łatwiejsze (w porównaniu z, powiedzmy, losowymi wielkościami obrażeń w RTS). Trudno to wytłumaczyć, ponieważ „przyszło mi to do głowy”. Jeśli średnia jest niższa, oznacza to, że musimy zwiększyć szansę wystąpienia zdarzenia i odwrotnie. Oto kilka przykładów
Teraz „przyszło mi do głowy”, że w pierwszym przykładzie 83% było po prostu „0,5 z 0,6” (innymi słowy „0,5 z 0,5 plus 0,1”). W przypadku zdarzeń losowych oznacza to:
Aby wygenerować zdarzenie, należy zasadniczo użyć następującego kodu:
I dlatego dostajesz kod, który wpisałem w sedno. Jestem prawie pewien, że wszystko to można wykorzystać w scenariuszu przypadkowego uszkodzenia, ale nie poświęciłem czasu, aby to rozgryźć.
Oświadczenie: To są wszystkie statystyki domowe, nie mam wykształcenia w tej dziedzinie. Moje testy jednostkowe jednak zdają.
źródło
samples
od wartości maksymalnej (w tym przypadku 100) od samego początku. W ten sposób stabilizacja RNG nie wymaga 99 iteracji. Tak czy inaczej, jedyną wadą, którą widzę w przypadku tej metody, jest to, że nie gwarantuje ona uczciwości, po prostu zapewnia stałą średnią.total = (average / 2) + desired
.To, o co prosisz, jest w rzeczywistości przeciwieństwem większości PRNG, rozkład nieliniowy. Po prostu zastosuj w swoich regułach pewną malejącą logikę zwrotów, Zakładając, że wszystko powyżej 1,0x jest pewnego rodzaju „trafieniem krytycznym”, po prostu powiedz, że w każdej rundzie Twoje szanse na uzyskanie krytyka wzrosną o X, dopóki nie zdobędziesz które punkty resetują do Y. Następnie wykonujesz dwa rzuty w każdej rundzie, jeden dla określenia krytycznego lub nie, a drugi dla rzeczywistej wielkości.
źródło
Sid Meier wygłosił doskonałe przemówienie na GDC 2010 na ten temat i na temat gier cywilizacyjnych. Spróbuję znaleźć i wkleić link później. W gruncie rzeczy postrzegana losowość to nie to samo, co prawdziwa losowość. Aby wszystko było w porządku, musisz przeanalizować poprzednie wyniki i zwrócić uwagę na psychologię graczy.
Za wszelką cenę unikaj serii pecha (jeśli poprzednie dwie tury były pechowe, następna powinna mieć szczęście). Gracz powinien zawsze mieć więcej szczęścia niż przeciwnik AI.
źródło
Użyj zmiennego nastawienia
Ogólny rozkład będzie tendencyjny według następującego wzoru:
Weź tę liczbę i skaluj ją odpowiednio do żądanego zakresu.
Za każdym razem, gdy gracz rzuci się pozytywnie, odejmij od błędu. Za każdym razem, gdy gracz rzuci się niekorzystnie, dodaj odchylenie. Zmienioną kwotę można przeskalować według tego, jak (nie) korzystny jest rzut lub może to być kwota płaska (lub kombinacja). Będziesz musiał dostosować określone wartości, aby dopasować je do swoich oczekiwań.
źródło