Forklaringen på RNGHvis du har læst op på Diablo 3 og drops eller bare har læst lidt med på chatten vil du sikkert være stødt på begrebet "RNG", og hvis du har undret dig over hvad det betyder og hvorfor det er så afgørende så hæng blot på.
RNG's rolle og betydningRNG står for Random Number Generator, en simpel nummer generator. Du kan sammenligne det med en terning, blot en terning som kan have et hvilket som helst antal af sider. Hver gang man "slår" med den spytter den et vilkårligt tal ud.
I spil er det typisk et middel til at afgøre en chance for at noget sker, mange anvender nemlig en % chance for en hændelse, for eksempel critical hit. Da man ikke bare kan sige at 10% af tiden skal der komme et critical hit bruger man i stedet en logisk test og en RNG.
Fordi der er med procenter er et spænd på 100 (0% = aldrig og 100% = altid) anvender man 100 sider på sin "terning" og beder den teste for om tallet der kommer ud er lig med eller mindre end den angivede chance. I dette tilfælde vil vi teste for om det fremkomne tal er 10 eller mindre efter et vi har fået et vilkårligt tal.
Funktionen i generatorenSom tidligere nævnt kan man ikke bare bede en computer om at komme med et tilfældigt tal, derfor laver man en funktion som mange af jer nok husker fra matematik i folkeskolen. Men for at den kan genere alle numre er den nød til at være kompleks og uendelig. Uendelig vil sige at hver gang vi får et resultat vil samme resultat blive puttet ind igen for at skabe et nyt.
For kompleksiteten anvender vi en kombination af store primtal og en sekundær funktion kaldet modulo. Hvorfor og hvordan de fungerer skal jeg nok forsøge at komme ind på hen ad vejen.
Vi starter med en grundværdi, vi kalder den X
0, og det skyldes at dette er tallet vi erstatter hver gang vi får et nyt resultat, der således bliver til X
1 og videre mod uendelighed som angives ved 0...n. Dette bliver vores variabel hvergang vi kører funktionen, eller "slår" med terningen.
X0...n
Dernæst ganger vi det med et stort - meget stort tal - gerne 5 eller flere cifre, jo større et spænd vi vil have vores terning til at virke over jo flere cifre bør dette tal være på. For et tal mellem 1 og 100 er 7 og 8 cifre ikke uvirkeligt. Dette tal kalder vi a.
a * X0...n
Næste skridt er at lægge et stort primtal til i samme størrelsesorden som "a". Primtal er tal som ikke kan deles med noget helt tal og give et helt tal, og netop den del er afgørende for at resultatet ikke kan blive det samme. Primtallet kalder vi p.
a * X0...n + p
Sidste skridt er en modulo af hele tallet vi er kommet frem til. Modulo vil sige at man deler et tal så mange gange man kan med det valgte tal og så beholder man resten. Det vil sige at 27 modulo 5 giver 2 fordi at 5 går op i 25 og det efterlader 2 op til 27. Dette er også grunden til at mindst et af de store tal bør være primtal, da a*x ikke kan give et primtal er det ikke afgørende om a er et primtal men det kan være en fordel. En anden ting at bemærke omkring modulo er at det ikke kan returnere modulo værdien, hvis vi som eksempel modulerer med 10 vil vi højest kunne få 9 tilbage. Hvis tallet 10 returneres vil det jo kunne deles med 10 igen og svaret vil blive 0. Derfor anvender man enten 0 som max eller lægger en til sit modulo og udelukker 0. Moulo angives som % og vi kaldet tallet m.
( a * X0...n + p ) % m
Her har vi så vores nummer generator funktion, så lad os da prøve den af.
Jeg starter med at vælge et tal til a, lad os gå med 4756283.
Til værdien p vælger jeg 8675309. Til hjælp med at finde primtal kan jeg anbefale siden
Primes Curious.
Som m har jeg valgt 101 til standard procent bedømmelse.
Altså ser funktionen for min nummer generator således ud:
( 4756283 * X + 8675309 ) % 101
Så mangler der blot at blive puttet et start tal ind og så kører den;
Hvis jeg starter med 15 får jeg 82, dernæst 85, 58, 99, 33, 21, 28, 66, 27, 75 og 47.
Og det ser da dejlig tilfældigt ud, gør det ikke? Hvis du vil lege videre med den selv og har Excel, kan du skrive dit ønskede start tal i det første felt "A1" og kopiere følgende til den næste celle
=MOD(4756283*A1+8675309;101)
Og derefter kopiere det videre alle de gange på har lyst til at lave et nyt tal.
Når RNG går imod énOfte vil man føle at RNG arbejder imod en og det er der en grund til. Hvis vi ser på sekvensen jeg fik skabt tidligere, og husker på at for at teste en % chance laver vi en logisk test efter et tal mindre end eller lig med vores % chance. Bruger vi Kadala's 10% chance for at give en legendary skal vi altså have et tal på 10 eller derunder.
Kigger man på sekvensen af 12 tal fra "Generatoren" jeg lavede tidligere er der ingen af dem som er 10 eller derunder, og faktisk vil den ikke kunne lave et tal på 10 eller derunder. Det mindste tal er nemlig de oprindelige 15 som den vil gentage efter 25 gange og starte hele sekvensen forfra. Netop her opstår hele problemet i disse nummer generatorer, at få alle tal til at fremkomme i sin generator er et kunststykke uden lige og uanset hvad vil man ende med en sekvens som gentager sig i et mønster.
Derfor kan man også let ende med at en "chance" ikke altid er helt tilsvarende fordi fordelingen ikke er helt korrekt. det er også derfor Blizzard under et interview ved årets BlizzCon sagde at nogle sjældne ting er lidt mere sjældne end de burde være. Tager vi eksempelvis en 2% chance er det nemlig nødvendigt at kunne skabe så lave og præcise tal og med et rimeligt interval, og det er ikke let. Små tal bliver altså meget mere sjældne end de store tal.
Samtidig gælder det også at disse små tal oftest vil komme lige efter hinanden fordi den første del af funktionen altid vi skabe en eksponentiel funktion baseret på inputtet. Eksempelvis tager vi a * 1 vil tallet svare til sig selv og kun primtallet vil ændre vores resultat, mens et større tal som a * 25 vil give et længere spring i tallene foruden primtallet variation.
Der er selvfølgelig måde at regne sig frem til et optimalt primtal. Det er netop moduleringen af primtallet som afgør hvor effektiv generatoren bliver, i mit tilfælde tidligere, giver moduleringen af primtallet 15 hvilket man hurtigt kan se et problem med. Det giver et meget lille muligt spring i tal da det ofte vil resultere i 0 eller 5 enere og altså kun 2 udfald her. Kun 2 under 10 er i stand til at lave alle numre, det er 3 og 7 (teknisk set også 9 men den medregnes ikke da 3 går op i 9). Så det gælder ganske enkelt om at få sin generator til at springe med et vilkårligt antal gange af et af disse to tal.
Siden antallet af disse gange er bestemt af produktet mellem a og x vil et større x give flere spring og et lille x give færre. Det giver sig til udtryk i at hvis du sidder og gambler og rammer et meget lavt tal så vil du få flere legendaries i træk, mens et højere lavt tal vil resultere i en legendary efterfulgt af en "tørkeperiode".
Afsluttende ordRNG er desværre et nødvendigt onde som hverken er let at have med at gøre for hverken spiller eller udvikler men nødvendigt når der arbejdes med variabler.
Og har du læst hele denne artikel håber jeg du har fået en smule forståelse hvorfor RNG'en Diablo 3 er ret kritiseret og betydningsfuld for oplevelsen af spillet.
Hvis du stadig har spørgsmål eller andre kommentarer er du velkommen til at stille dem her.
P.S. Det nævnte eksempel på en RNG er ikke den eneste måde at lave en, men et udtryk for den mest basale udgave som selvfølgelig kan udvides for bedre at at kunne ramme flere tal, nogle RNG'er har også skiftende værdier i sig for at blande tallene yderligere.