Ich habe tatsächlich welche geschrieben Code geschrieben . Der Kern davon ist die Verwendung von Statistiken, um Pechsträhnen zu korrigieren. Sie können dies tun, indem Sie nachverfolgen, wie oft das Ereignis aufgetreten ist, und die vom PRNG generierte Zahl anhand dieser Werte beeinflussen.
Erstens, wie behalten wir den Prozentsatz der Ereignisse im Auge? Die naive Art, dies zu tun, wäre, alle jemals generierten Zahlen im Speicher zu halten und sie zu mitteln: Das würde funktionieren, ist aber schrecklich ineffizient. Nachdem ich ein wenig nachgedacht hatte, kam ich auf Folgendes (das ist im Grunde genommen a kumulativer gleitender Durchschnitt ist ).
Nehmen Sie die folgenden PRNG-Proben (wo wir verarbeiten, wenn die Probe> = 0,5 ist):
Values: 0.1, 0.5, 0.9, 0.4, 0.8
Events: 0 , 1 , 1 , 0 , 1
Percentage: 60%
Beachten Sie, dass jeder Wert zu 1/5 des Endergebnisses beiträgt. Schauen wir es uns anders an:
Values: 0.1, 0.5
Events: 0 , 1
Beachten Sie, dass das 0
zu 50% des Wertes beiträgt und das1
beiträgt. Etwas weiter genommen:
Values: [0.1, 0.5], 0.9
Events: [0 , 1 ], 1
Jetzt tragen die ersten Werte 66% und die letzten 33% zum Wert bei. Wir können dies im Grunde auf den folgenden Prozess zurückführen:
result = // 0 or 1 depending on the result of the event that was just generated
new_samples = samples + 1
average = (average * samples / new_samples) + (result * 1 / new_samples)
// Essentially:
average = (average * samples / new_samples) + (result / new_samples)
// You might want to limit this to, say, 100.
// Leaving it to carry on increasing can lead to unfairness
// if the game draws on forever.
samples = new_samples
Jetzt müssen wir das Ergebnis des vom PRNG abgetasteten Werts verzerren, da wir hier eine prozentuale Chance haben, dass die Dinge viel einfacher sind (im Vergleich zu beispielsweise zufälligen Schadensbeträgen in einem RTS). Das wird schwer zu erklären sein, weil es mir gerade eingefallen ist. Wenn der Durchschnitt niedriger ist, bedeutet dies, dass wir die Wahrscheinlichkeit des Eintretens des Ereignisses erhöhen müssen und umgekehrt. Also einige Beispiele
average = 0.1
desired = 0.5
corrected_chance = 83%
average = 0.2
desired = 0.5
corrected_chance = 71%
average = 0.5
desired = 0.5
corrected_change = 50%
Was mir jetzt einfiel, war, dass im ersten Beispiel 83% nur "0,5 von 0,6" waren (mit anderen Worten "0,5 von 0,5 plus 0,1"). In zufälligen Ereignissen bedeutet dies entweder:
procced = (sample * 0.6) > 0.1
// or
procced = (sample * 0.6) <= 0.5
Um also ein Ereignis zu generieren, würden Sie grundsätzlich den folgenden Code verwenden:
total = average + desired
sample = rng_sample() * total // where the RNG provides a value between 0 and 1
procced = sample <= desired
Und deshalb bekommst du den Code, den ich in den Kern geschrieben habe. Ich bin mir ziemlich sicher, dass dies alles in dem zufälligen Schadensfall-Szenario verwendet werden kann, aber ich habe mir nicht die Zeit genommen, dies herauszufinden.
Haftungsausschluss: Dies ist alles einheimische Statistik, ich habe keine Ausbildung in diesem Bereich. Meine Unit-Tests bestehen allerdings.