Aslında bunu yapmak için bazı kodlar yazdım . Bunun amacı şanssız çizgileri düzeltmek için istatistik kullanıyor. Bunu yapabilmenizin yolu, etkinliğin kaç kez gerçekleştiğini takip etmek ve PRNG tarafından oluşturulan sayıyı önyargılı hale getirmek için kullanmaktır.
Öncelikle, olayların yüzdesini nasıl takip ederiz? Bunu yapmanın saf yolu, şimdiye kadar üretilen tüm sayıları bellekte tutmak ve onları ortalamaktır: hangisi işe yarayacak ama korkunç derecede verimsiz. Küçük bir düşünceden sonra aşağıdakileri gündeme getirdim (temelde kümülatif bir hareketli ortalama ).
Aşağıdaki PRNG numunelerini alın (numunenin> = 0,5 olması durumunda işlem yapalım):
Values: 0.1, 0.5, 0.9, 0.4, 0.8
Events: 0 , 1 , 1 , 0 , 1
Percentage: 60%
Her değerin nihai sonucun 1 / 5'ine katkıda bulunduğuna dikkat edin. Buna başka bir yoldan bakalım:
Values: 0.1, 0.5
Events: 0 , 1
0
Değerin% 50'sine ve değerin% 50'sine katkıda bulunduğuna dikkat edin 1
. Biraz daha ileri götürülmüş:
Values: [0.1, 0.5], 0.9
Events: [0 , 1 ], 1
Şimdi ilk değerler, değerin% 66'sına ve son% 33'üne katkıda bulunur. Temel olarak bunu aşağıdaki prosese damlatabiliriz:
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
Şimdi PRNG'den örneklenen değerin sonucunu önyargılı hale getirmemiz gerekiyor, çünkü burada bir yüzde şans için gidiyoruz (işler, RTS'deki rastgele miktarlara karşı). Bunu açıklamak zor olacak çünkü 'başıma geldi'. Eğer ortalama daha düşükse, olayın meydana gelme şansını arttırmamız gerektiği ve bunun tersi de geçerlidir. Yani bazı örnekler
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%
Şimdi “başıma gelenler”, ilk örnekte% 83'ün yalnızca "0.6'dan 0.6" (başka bir deyişle "0.5'ten 0.5 artı 0.1") olduğu anlamına geliyor. Rastgele olay terimlerinde şu anlama gelir:
procced = (sample * 0.6) > 0.1
// or
procced = (sample * 0.6) <= 0.5
Dolayısıyla bir etkinlik oluşturmak için temel olarak aşağıdaki kodu kullanırsınız:
total = average + desired
sample = rng_sample() * total // where the RNG provides a value between 0 and 1
procced = sample <= desired
Ve böylece özümde koyduğum kodu alırsın. Bunların rastgele hasar durum senaryosunda kullanılabileceğinden eminim, ancak bunu anlamaya zamanım olmadı.
Feragatname: Bu, tüm evde üretilen istatistikler, bu alanda eğitimim yok. Birim testlerim yine de başarılı.