Jak mogę zapobiec dominacji niewielkiej przewagi liczbowej nad równowagą spotkania?

27

Od jakiegoś czasu majstruję przy grze i mam z tym sporo problemów:

Mam dwie postacie, z których każda ma atrybuty (około dziesięciu) w zakresie (od 1 do 20). Chcę użyć tych atrybutów do wygenerowania „rzutu” takiego, że wyższy rzut wygrywa to konkretne spotkanie. Warto zauważyć, że obie postacie nie zadają sobie obrażeń / nie bronią się. Obaj sprawdzają, czy zdadzą to, co, jak sądzę, moglibyśmy nazwać sprawdzeniem umiejętności. Oba toczą się, by przekazać / nie zaliczyć wspólnej wartości. Nie wchodzą ze sobą w interakcje.

Jednak gdy jedna z postaci ma choćby małą przewagę liczbową, każda formuła, którą wymyśliłem, powoduje, że ta wciąż nieco lepsza wygrywa ogromną większość czasu. To jest niepożądane.

Próbowałem przypisać wagę „najbardziej odpowiedniego” atrybutu testu do 80% i sumy pozostałych atrybutów do 20%. Próbowałem również porównać średnie, aby uzyskać względną różnicę, i użyć tego, aby wzmocnić słabszą postać. Oba podejścia przyniosły znaczące korzyści, które staram się usunąć (na przykład, jeśli uruchomię spotkanie 5000 razy, całkiem regularnie daje to jednej stronie wygrywając wszystkie 5000).

Wydaje się, że dodanie komponentu „szczęście” ma znaczenie, jeśli w jakiś sposób jest ważone na korzyść mniejszej postaci, a ja nie osiągnąłem tam dobrego balansu.

Jakie podejścia mogę zastosować, aby osłabić wpływ małej przewagi liczbowej, ale nadal zachować i zwiększyć tę przewagę wraz ze wzrostem względnej luki w atrybutach?


Na żądanie, oto szczegóły, które mam do tej pory. Niektóre rzeczy, których jeszcze nie rozgryzłem, więc pozostają ogólnikami:

W tej chwili rzut jest generowany jako

0.8 * (mainAttribute) + 0.2 (1/3 * subAttA + 1/3 * subAttB * 1/3 subAttC)

Obecnie daje to wartości w okolicach 4,0. Atrybuty są generowane losowo między określonymi zakresami. W bieżącym teście używa się jednej postaci o atrybutach od 2 do 4, a przeciwnika między 3 a 5. Przewidywalnie, daje to średnie wartości odpowiednio zbliżone do 3 i 4.

Z tą jednopunktową przewagą chciałbym zobaczyć silniejszą z dwóch wygranych w obszarze od 55% do 60% czasu, z tym skalowaniem aż do wygrania przez około 80% czasu ze średnią przewagą atrybutów wynoszącą 5 lub 6, 90% z przewagą 7 lub 8, pozostawiając miejsce na mało prawdopodobne zwycięstwo, gdy różnica wzrośnie. Wolałbym nigdy nie mieć gwarantowanych wygranych, ale być może rzeczy stają się bardzo mało prawdopodobne - na przykład wygraną 99,5% lub 99,6% czasu, kiedy różnica staje się bardzo duża.

Obecna formuła generuje liczbę nieprzypadkową. Losowość wynika z wyboru odpowiednich atrybutów. Nie wszystkie atrybuty są używane dla każdego rzutu. Możliwe jest, że ten z ogólnie słabszymi atrybutami będzie silniejszy w obszarach istotnych dla tego rzutu i ukradnie zwycięstwo. Ale, jak można przewidzieć, zdarza się to rzadko.

Moja kolejna próba polegała na zważeniu ich względnych sił, biorąc średnią wszystkich statystyk każdego z nich, dzieląc je między sobą i wykorzystując tę ​​wartość, aby w niewielkim stopniu wzmocnić mniejszą postać. To trochę wygładziło, ale nadal wykazywało wyraźną tendencję do generowania 5000 zwycięstw dla jednego faceta na 5000 prób.

ffenliv
źródło
2
Mówisz, że „rola jest generowana”, ale następnie publikujesz formułę, która zawsze wygeneruje stałą liczbę. Gdzie jest losowość?
Philipp
1
Więc jeśli dobrze cię rozumiem, jedyną przypadkowością w twojej mechanice gry jest losowy wybór głównego atrybutu?
Philipp
2
Ale jak sugeruje @Philipp, 5000 prób przyniesie dokładnie takie same wyniki? Czy generujesz nowe atrybuty dla każdej symulacji
Felsir
1
Jak wygrywa jeden z dwóch, jeśli nie wchodzą ze sobą w interakcje? Wydaje się, że brakuje tutaj niektórych danych?
Erik
1
Rzut, który każdy wytwarza, jest porównywany z celem, do którego osiągnięcia jest wymagany. Jeśli jeden osiągnie, a drugi nie, to wygrywa. Jeśli obaj go osiągną, wygrywa wyższa z dwóch. Jeśli żadna nie osiągnie, żadna nie ma sensu. W mało prawdopodobnym nawet remisie podzielili punkt. Przez „brak interakcji” miałem na myśli nie uderzanie się ani obronę przed sobą w tradycyjnym znaczeniu, ponieważ tam właśnie prowadzona była wstępna dyskusja.
ffenliv

Odpowiedzi:

36

Problem z twoim podejściem polega na tym, że decydujesz o wyniku walki w momencie, gdy decydujesz o głównej statystyki. Kiedy masz 4 główne statystyki, a wojownik jest lepszy tylko w jednym z nich, ich szansa na wygraną wynosi zawsze 1 na 4, bez względu na to, jak duże są faktycznie różnice. Jeśli chcesz uzyskać bardziej szczegółowe wyniki, potrzebujesz większej dokładności losowości.

Po pierwsze, myślę, że możesz zachować losowy wybór głównego atrybutu, a także możesz zachować formułę, jeśli chcesz. Jest to liczba reprezentująca, ile przewagi ma ten walczący w tym konkretnym starciu. W dalszej części tego posta będę odnosił się do tego jako sprawiedliwego power.

Metodą, którą stosowałem w wielu grach i która całkiem dobrze mi pomogła, jeśli chodzi o pojedynek dwóch rzeczy z pewnymi power, jest wyrzucenie losowej liczby zmiennoprzecinkowej pomiędzy 0i powerdla obu i sprawdzenie, kto rzucił wyżej. Oto lista oczekiwanych wyników tej metody. Procenty nie są obliczane, ale generowane eksperymentalnie przez uruchomienie 100000 walk na kombinację, liczenie iteracji i liczenie, kto wygrał, jak często:

PowerA | PowerB | Win chance of A
  9    |   1    |    94.5%
  8    |   2    |    87.5%
  7    |   3    |    78.6%
  6    |   4    |    66.6%
  5    |   5    |    50.0%
  4    |   6    |    33.3%
  3    |   7    |    21.5%
  2    |   8    |    12.5%
  1    |   9    |    5.5%

Zaletą tego algorytmu jest to, że skaluje się bez względu na to, jak duże są liczby. Szansa 0,3 vs 0,7 jest taka sama jak szansa 3 vs 7, 300 vs. 700 lub 3 000 000 000 vs. 7 000 000 000.

Jeśli jest to zbyt nieprzewidywalne dla twojego gustu, możesz uczynić walkę bardziej przewidywalną, rzucając wiele losowych liczb dla każdego z walczących i sumując je. Z powodu prawa wielkich liczb wiele losowych zdarzeń wyrówna się i przyniesie bardziej przewidywalne wyniki. Oto tabela z inną liczbą iteracji.

| A | B | Iterations
|   |   |       1 |     2 |     3 |     4 |     5 |     6 |     7 |     8 |     9 |
-----------------------------------------------------------------------------------
| 9 | 1 |   94.5% | 99.3% | 99.9% |100.0% |100.0% |100.0% |100.0% |100.0% |100.0% | 
| 8 | 2 |   87.4% | 96.3% | 98.8% | 99.5% | 99.8% |100.0% |100.0% |100.0% |100.0% | 
| 7 | 3 |   78.7% | 89.2% | 94.0% | 96.6% | 97.8% | 98.9% | 99.2% | 99.6% | 99.7% | 
| 6 | 4 |   66.8% | 74.3% | 79.2% | 82.9% | 85.7% | 88.0% | 89.9% | 91.2% | 92.5% | 
| 5 | 5 |   50.0% | 50.0% | 50.0% | 50.0% | 50.0% | 50.0% | 50.0% | 50.0% | 50.0% | 
| 4 | 6 |   33.6% | 25.6% | 20.9% | 17.1% | 14.7% | 12.0% | 10.2% |  8.9% |  7.5% | 
| 3 | 7 |   21.4% | 10.7% |  6.0% |  3.5% |  2.0% |  1.2% |  0.7% |  0.4% |  0.3% | 
| 2 | 8 |   12.7% |  3.7% |  1.2% |  0.4% |  0.1% |  0.1% |  0.0% |  0.0% |  0.0% | 
| 1 | 9 |    5.5% |  0.7% |  0.1% |  0.0% |  0.0% |  0.0% |  0.0% |  0.0% |  0.0% | 

Wyniki 100% i 0% w powyższej tabeli są iluzją z powodu zaokrąglania różnic. Jeśli powerwalczący nie ma dokładnie 0, zawsze istnieje możliwość, że wygrają. Po prostu nie zdarzyło się to w powyższym teście, więc możesz spodziewać się, że będzie poniżej 1: 100000.

Możesz również zauważyć niewielkie nieregularności, które można przypisać wahaniom nastroju java.lang.Random i mogą się nie pojawić, gdy uruchomisz kod ponownie z innym ziarnem.

Program, którego użyłem do wygenerowania tej tabeli (Java).

public class Main {

    private static Random random = new Random();
    private static final int SAMPLES = 100000;

    public static void main(String[] args) {        
        for (int i = 1; i < 10; i++) {
            double powerA = 10.0 - i;
            double powerB = i;
            System.out.print("| ");
            System.out.print((int)powerA);
            System.out.print(" | ");
            System.out.print((int)powerB);
            System.out.print(" |   ");

            for (int iterations = 1; iterations < 10; iterations++) {
                int wins = 0;
                for (int j = 0; j < SAMPLES; j++) {
                    if (fight(powerA, powerB, iterations)) wins++;
                }
                System.out.print(String.format("%2.1f", 100.0 * (double)wins / (double)SAMPLES));
                System.out.print("% | ");
            }
            System.out.print("\n");
        }       
    }

    private static boolean fight(double powerA, double powerB, int iterations) {        
        double sumA = 0.0f;
        double sumB = 0.0f;     
        for (int i = 0; i < iterations; i++) {
            sumA += random.nextDouble() * powerA;
            sumB += random.nextDouble() * powerB;

        }       
        return sumA > sumB;
    }
}

Jeśli chcesz używać tego kodu w swojej grze, jest on objęty licencją WTF Public License Version 2 opublikowaną przez Sama Hocevara .

Philipp
źródło
To ciekawe podejście. W niektórych moich próbach byłem w połowie drogi do tego. Rozwiążę to i spróbuję. Wielkie dzięki.
ffenliv
10
Procenty w pierwszej tabeli można obliczyć dokładnie tak, jak 1 - powerA / ( 2 * powerB ).
Kyle
2
@Kyle To działa tylko tak długo, jak powerA < powerB. Gdy powerA będzie większy, musisz przełączyć się na powerB / (2 * powerA).
Dorus,
1
Nie jestem pewien, czy StackExchange ToS pozwala ci odstąpić od obowiązkowej licencji witryny na treść i kod, nawet jeśli twoja licencja jest bardziej liberalna niż ich. Oczywiście nie można ustalić, czy jest to proponowany MIT, czy nadal CC.
Lars Viklund
5
@LarsViklund Zaczynasz tutaj dyskusję nie na temat, ale nie, to nieprawda. Licencja na stackexchange jest niewyłączna, co oznacza, że ​​nadal mogę swobodnie oddawać moją własność intelektualną na podstawie innych warunków licencyjnych, kiedy chcę. Mój wkład jest podwójnie licencjonowany na licencji CC-BY-SA (zgodnie z mandatem Stackexchange) i WTFPL. Możesz wybrać, pod jakim warunkiem chciałbyś wykorzystać mój wkład.
Philipp
13

Twoim błędem jest podejście oparte na „kości”. Jesteś na komputerze, możesz korzystać z dowolnego systemu, który ci się podoba. Zrób tabelę, która zmienia różnicę wartości w procentową szansę na wygraną, a następnie możesz ustawić wartości na absolutnie wszystko, co chcesz, np.

Difference (A-B) | %chance A wins
-----------------|---------------
+5 or greater    | 100%
+4               | 95%
+3               | 85%
+2               | 70%
+1               | 55%
0                | 50%

(Musisz zrobić tylko połowę stołu, po prostu zawsze wybierz A jako ten z wyższą statystyką)

Oczywiście te liczby są tylko przykładem, możesz sprawić, by śledził to, co Ci odpowiada.

Jack Aidley
źródło
2
Chociaż obecnie pracuję z systemem opartym na przyjętej odpowiedzi, jest to dość proste i może być również dla mnie dobrym rozwiązaniem. Wiedziałem, że przejdzie dla mnie dobry stary StackExchange.
ffenliv
5

To jest dość głębokie pytanie, z punktu widzenia mechaniki gry. Ale jest kilka rzeczy, które mogą pomóc.

Po pierwsze, dlatego większość gier ma osobny komponent do trafienia i obrażeń, gdzie jest „rzut”, aby sprawdzić, czy trafiłeś w obrażenia, a następnie „rzut” na tabelę obrażeń lub zasięg dla danej postaci. Prowadzi to również do niektórych standardowych archetypów w różnych gatunkach, w których możesz mieć mniejsze, szybsze postacie, które mają mniej punktów życia, ale zadają większe obrażenia (magowie z armat ze szkła, niektóre rodzaje łotrów) i większe, opancerzone postacie, które trafiają mniej obrażeń (czołgi, wojownicy) ).

Prowadzi to do naturalnej równowagi, w której mniejsza postać może być krucha, ale unika trafienia tak często ze względu na zdolność typu zwinności, a także wyrównuje pole gry, zadając większe obrażenia (zaklęcie lub efekt trucizny, który zadaje obrażenia ponad czas). Czołg może być wolniejszy i częściej trafiany, ale często ma ogromną studnię zdrowia lub punktów życia do utrzymania, jednak zwykle zadaje mniej obrażeń na trafienie (lub obrażeń na sekundę).

Tłem dla nich jest to, dlaczego wiele gier nieustannie przechodzi przez balansowanie broni, klas i statystyk. World or Warcraft, Destiny, Diablo, Battlefield: każdy rodzaj gry w dowolnym gatunku często przechodzi z czasem balansowanie i dostrajanie.

To może nie być bezpośrednia odpowiedź, ale poprosiłeś o ogólne pomysły. Oceńmy więc także system gry.

Jak działają te atrybuty? Jeśli wszystko inne jest równe (brak archetypu, brak zbroi, lepszej broni itp.), Wówczas wszelkie niewielkie zyski absolutnie prawdopodobnie rzucą rzeczy na korzyść jednej strony. Dodanie aspektów do walki komplikuje każdy system, ale zapewnia także większą elastyczność.

Jesse Williams
źródło
Nawiasem mówiąc, myślę, że jest to doskonałe pytanie i może prowadzić do bardzo interesujących dyskusji na temat mechaniki gry. Możliwe, że w końcu stanie się to oparte na opiniach, dlatego ważne jest, aby uważać na takie styczne (ta gra robi to lepiej niż ta gra itd.), Ale istnieją pewne fundamentalne elementy, które mogą być pouczające, gdy więcej osób publikuje.
Jesse Williams
Zabawne, że najpierw miałem mechanikę „trafienia” i „uszkodzenia”, ale złomowałem ją z powodów, których już nie pamiętam (i to było dopiero wczoraj. Moja pamięć jest ... słaba) Powinienem być czysty, postacie nie atakują się / nie bronią. Nie ma elementu powodującego uszkodzenie. Jest to sprawdzian umiejętności, w którym oba są sprawdzane względem wspólnej wartości, aby sprawdzić, czy rzut „mija”. Nie ma interakcji między tymi dwoma, które konkurują ze sobą.
ffenliv
2

Są dwie wielkie rzeczy.

Po pierwsze pamiętaj, że jesteś na komputerze. Możesz stworzyć dowolny system. Nie musisz ograniczać się do rzutu d20, chociaż dla graczy jest to łatwe do zrozumienia. Rzeczy takie jak rzucanie 6 kośćmi 6 kości są łatwe na komputerze i dają znacznie mniej losowe wyniki.

Po drugie, patrząc na inne systemy, takie jak D&D, oczywiste jest, że po prostu ograniczają efekt atrybutów. Zamiast dodawać statystykę podstawową do 80% wartości reguły, zmniejsz ją i zwiększ subtelność. Na przykład w D&D, jeśli masz 18 zręczności, dostajesz tylko 4 jako bonus do swojej klasy pancerza.

Krótko mówiąc, wszystko, co musisz zrobić, to zmniejszyć swoją domenę, aby lepiej pasowała do twojego zakresu. Ale jakościowo pomyślałbym, że spojrzenie na inne systemy i wymyślenie rzeczy, które wydają się mniej matematyczne, zapewniłoby graczowi bardziej satysfakcjonujący system.

Yudrist
źródło
1d20 lub 6d6 lub 5d4 - wyniki nie są mniej lub bardziej losowe, zmieniasz tylko zakres. Losowo jest losowy. Zmniejszanie zasięgu i domeny nie wystarcza do zrównoważenia systemu. Prawdopodobnie wydłuży to tylko dłużej.
Jesse Williams
8
@JesseWilliams to nieprawda. 1d20 ma jednakową szansę na uzyskanie dowolnej z możliwych wartości. Z 5d4 masz większe szanse na zdobycie 12 lub 13 niż na 20.
Rob Watts
Wiele rolek pozwala także ukryć wady generatorów liczb, więc jest to szczególnie ważne na komputerach. W rzeczywistości łączenie rolek na nieco bitowym poziomie jest właściwie podstawą wielu generatorów.
Judud
Poprawiono mnie.
Jesse Williams
3
@RobWatts, który wciąż nie jest mniej lub bardziej przypadkowy, to po prostu inna dystrybucja. Posiadanie informacji o wcześniejszych „rzutach” nie pozwala na lepsze przewidywanie przyszłych wyników (ignorowanie wad w RNG), więc jest tak samo losowe.
chbaker0
1

Co powiesz na to: dodaj stałą, np. 1000, do wszystkich danych atrybutów. Wtedy względna różnica staje się bardzo mała.

Alex
źródło
1

Poznaj swoje liczby

Dodając trochę do odpowiedzi Filipa , a mianowicie, że rand [x] w porównaniu do rand [y] nie zawsze daje to, czego się spodziewamy. Poniżej tabeli, w której porównujemy A z B. Zarówno A, jak i B mają wartości 1 ... 10. Porównujemy na dwa sposoby (uwaga: rand () w tym przypadku generuje liczby całkowite, tj. Rolki):

  1. rand [A]> rand [B]
  2. rand [A] ≥ rand [B] (tzn. większy lub równy)

Dodatkowo porównujemy

  1. rand [A * 1000000]> rand [B * 1000000]
    (w tym przypadku nie ma znaczenia, czy jest> czy ≥, ponieważ są tak blisko). Te duże liczby znajdują się w nawiasach.

Komórki zawierają%. Każdy wynik zawiera 1 milion iteracji (wykonanych przy użyciu Dyalog APL ).

┌────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┐
 A      B  1 (1000000)│ 2 (2000000)│ 3 (3000000)│ 4 (4000000)│ 5 (5000000)│ 6 (6000000)│ 7 (7000000)│ 8 (8000000)│ 9 (9000000)│10(10000000)│
├────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┤
 1 (1000000)│ >0(50) 100  >0(25) 50  >0(17) 33  >0(13) 25  >0(10) 20   >0(8) 17   >0(7) 14   >0(6) 13   >0(6) 11   >0(5) 10
├────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┤
 2 (2000000)│>50(75) 100 >25(50) 75 >17(33) 50 >12(25) 38 >10(20) 30  >8(17) 25  >7(14) 21  >6(13) 19  >6(11) 17  >5(10) 15
├────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┤
 3 (3000000)│>67(83) 100 >50(67) 83 >33(50) 67 >25(37) 50 >20(30) 40 >17(25) 33 >14(21) 29 >12(19) 25 >11(17) 22 >10(15) 20
├────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┤
 4 (4000000)│>75(87) 100 >62(75) 88 >50(62) 75 >37(50) 63 >30(40) 50 >25(33) 42 >21(29) 36 >19(25) 31 >17(22) 28 >15(20) 25
├────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┤
 5 (5000000)│>80(90) 100 >70(80) 90 >60(70) 80 >50(60) 70 >40(50) 60 >33(42) 50 >29(36) 43 >25(31) 38 >22(28) 33 >20(25) 30
├────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┤
 6 (6000000)│>83(92) 100 >75(83) 92 >67(75) 83 >58(67) 75 >50(58) 67 >42(50) 58 >36(43) 50 >31(38) 44 >28(33) 39 >25(30) 35
├────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┤
 7 (7000000)│>86(93) 100 >79(86) 93 >71(79) 86 >64(71) 79 >57(64) 71 >50(57) 64 >43(50) 57 >38(44) 50 >33(39) 44 >30(35) 40
├────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┤
 8 (8000000)│>88(94) 100 >81(87) 94 >75(81) 87 >69(75) 81 >63(69) 75 >56(62) 69 >50(56) 62 >44(50) 56 >39(44) 50 >35(40) 45
├────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┤
 9 (9000000)│>89(94) 100 >83(89) 94 >78(83) 89 >72(78) 83 >67(72) 78 >61(67) 72 >55(61) 67 >50(56) 61 >44(50) 56 >40(45) 50
├────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┼────────────┤
10(10000000)│>90(95) 100 >85(90) 95 >80(85) 90 >75(80) 85 >70(75) 80 >65(70) 75 >60(65) 70 >55(60) 65 >50(55) 60 >45(50) 55
└────────────┴────────────┴────────────┴────────────┴────────────┴────────────┴────────────┴────────────┴────────────┴────────────┴────────────┘

Jeśli spojrzymy na A = 2 i B = 3 (i 1 milion testów):

  • rand (2) jest większy niż rand (3) w 17% przypadków
  • rand (2000000) jest większy niż rand (3000000) w 33% przypadków (skalowanie zawiadomień ./ .. zaokrąglanie liczb całkowitych)
  • rand (2) jest większy lub równy rand (3) w 50% przypadków
  • (rand (2000000) jest również większy lub równy rand (3000000) w 50% przypadków)

Niespodziankami mogą być:

  • rand (2)> rand (3) tylko w 17% przypadków
  • rand (10)> rand (10) w 45% przypadków
  • rand (6)> rand (5) za każdym razem

Mógłbym w rzeczywistości rozwiązać to Q inaczej, po prostu ręcznie wpisując tabelę 10x10 z ładnymi, pożądanymi wartościami procentowymi (może ktoś też chce nieregularności?). Następnie w razie potrzeby interpoluj między dwiema wartościami, aby uzyskać dokładny procent, powiedzmy, że to z jakiegoś powodu 53. Wtedy łatwo jest wygenerować trafienie o prawdopodobieństwie 53%, 0 lub 1, po prostu wykonując rand (100) i testując jeśli jest mniejsza lub równa 53 :-).

Jest to zgodne z linią, o której wspomina Jack Aidley .

Stormwind
źródło
1
Czy używasz generatora liczb losowych, który generuje liczby całkowite? Moja odpowiedź wykorzystuje RNG, który generuje liczby zmiennoprzecinkowe podwójnej precyzji między 0.0a 1.0. W takim przypadku różnica między >i >=jest znikoma. Możesz to podkreślić.
Philipp
Tak, to część zamierzonego komunikatu, aby tylko wskazać zmienne zachowanie spacji numerycznych, np. liczby całkowite o małej wartości (szorstka ziarnistość) w porównaniu z liczbami całkowitymi o dużej wartości (a nawet liczba zmiennoprzecinkowa) o drobnej ziarnistości. Wstawię gdzieś „liczbę całkowitą”, dzięki za wskazanie. Faktycznie zwracam uwagę na tę pomijalność: „(w tym przypadku nie ma znaczenia, czy jest> czy ≥, ponieważ są tak blisko”). Często liczby znajdują zaskakujące wartości (dla umysłu Hmana), jeśli system nie jest zachęcany do szukania równowagi. Ogólnie rzecz biorąc, ofc, niekoniecznie w tym przypadku.
Stormwind
0

Tradycyjne podejście, do którego pośrednio odwoływało się kilka odpowiedzi, ale nikt tak naprawdę nie przeliterował, polega na tym, że zadanie wymaga ustalonego rzutu kostką i dodaje modyfikator umiejętności wyprowadzony z twoich statystyk.

Na przykład, jeśli dwóch graczy postępuje zgodnie z procedurą:

  • Rzuć 14-stronną kostką
  • Dodaj ich modyfikator do rzutu kostką

i powtarzaj, dopóki jedna strona nie przebije drugiej, wtedy otrzymasz liczby w swoim zakresie: oto szanse na zwycięstwo z daną przewagą liczbową nad ich modyfikatorem:

0   50%
1   57%
2   64%
3   70%
4   76%
5   81%
6   85%
7   89%
8   92%
9   95%
10  97%

źródło
0

Bohaterowie nie stawiają sobie wzajemnych wyzwań o dominację. Kwestionują wymagania. Co jeśli oba spełnią wymagania? Kto wygrywa? Dziwię się, że nie podważyłeś logiki na tyle, że nawet poszedłeś z nią do obliczeń.

Tak czy inaczej, oto dwie rzeczy, które mogą ci pomóc.

Wygraj przypadek z przewagą:

JEŚLI pasek podania / sprawdzenie umiejętności jest wynikiem 10. A Rzuca 40. B Rzuca 42. JEŻELI tylko jeden musi wygrać. Począwszy od równej wygranej A 50% / B 50% wygranej. Możesz dodać%, aby wygrać szansę na podstawie przewagi. Rzut B ma (42–40) / 40 = 5% przewagi pod względem rzutu. Dodanie go bezpośrednio zwiększa szansę wygranej B na 55%. Lub możesz określić niestandardową szansę wygranej na procent przewagi. Powiedz, że za każdą 100% przewagę dodajesz 10% szansy na wygraną. Więc jeśli A wyrzuci 10, a B wyrzuci 20. Następnie A wygrywa 40%, a B wygrywa 60% przypadków.

Koncepcja uczciwej losowości:

Wykonując standardowe 30% szansy na wygraną, możesz w końcu wygrać 38 czeków na 100.

Niektórzy ludzie chcą dodatkowego kroku na drodze do uczciwości i upewniają się, że 30% szansy zawsze wygrywa dokładnie 30 na 100 spotkań i wystarcza losowość, że nie wiadomo, które spotkania w sekwencji są wygrane, a które przegrane.

Jest to szczególnie przydatne w przypadku dobrze obliczonych ekonomii gier. Ponieważ losowa statystyka 70% szans na wygraną. Powiedz 70% szansie, że mob zrzuci 5 sztuk złota. Moby mogą w końcu upuścić złoto 81 razy na 100. Co powoduje, że przychody / wydatki wypływają z równowagi. I w zależności od tego, ile podmiotów / instancji używa takich rolek, nieuchronnie powstaje inflacja i / lub niedobory. Oczywiście wielu ludzi nie ma nawet przybliżonego oszacowania pełnego podsumowania nakładów / wydatków ich gospodarki. Wiele osób wystarcza na robienie „większości” punktów ekonomicznych. I pozostaw niektóre zmienne generacji, które nie są obliczane i rozbieżności stosu w czasie nawet przy uczciwej losowości.

Inflacja i niedobory same w sobie nie stanowią problemu. Możesz zarządzać nieuczciwymi przypadkami, a nawet nieprzewidzianymi zmiennymi, jeśli Twoja gospodarka jest odpowiednio skonfigurowana, aby odpowiednio reagować na inflację i niedobór.

Po co zawracać sobie tym głowę, ponieważ prawo dużej liczby wyrównuje sytuację na dłuższą metę?

Nie każde środowisko może zachować swoje zachowanie projektowe, licząc na to, że zostaną wyrównywane później ...

helena4
źródło
Szczególnie podoba mi się ostatnie zdanie. Chwytanie skądinąd: uważam, że na przykład stosunek wejścia do wyjścia Viking Lotto wynosi około 4: 1 na dłuższą metę (gdzie „długie” można zastąpić „dużym”); ma niemal kontrowersyjne (ale dobrze zdefiniowane) zachowanie projektowe i działa. Nie można wykonać matematyki poniżej, jeśli zachowanie projektowe nie zostanie najpierw dokładnie określone. Liczby bywają niekontrolowane bez kontroli ...
Stormwind,
@Stormwind oczywiście. Jeśli brakuje projektu / teorii - matematyka jest bezużyteczna. To tylko narzędzie. Widziałem, że projektanci z matematyki na piątym poziomie osiągają dobre wyniki ekonomiczne. Po prostu zmapowali logicznie to, co chcieli zrobić, i poszli do matematyki (zwykle do programistów), aby uzyskać narzędzia / porady, jak to zrobić. Jakoś nadal nie jest to oczywiste dla wszystkich - im więcej problemów masz z planem - tym więcej bólu głowy zobaczysz w budowie. Po prostu chwycenie jakiegoś systemu i jego ulepszenie całkowicie mija się z celem. Jeśli po prostu zdecydujesz się na to, co działa najpierw, nie jest to naprawdę kreatywne.
helena4