मैंने वास्तव में ऐसा करने के लिए कुछ कोड लिखे थे । इसका सार अस्वाभाविक लकीरों को सही करने के लिए आँकड़ों का उपयोग कर रहा है। जिस तरह से आप कर सकते हैं, वह यह है कि घटना कितनी बार हुई है और PRNG द्वारा उत्पन्न संख्या को पूर्वाग्रह करने के लिए उपयोग करना है।
सबसे पहले, हम घटनाओं के प्रतिशत का ट्रैक कैसे रखते हैं? ऐसा करने का भोला तरीका स्मृति में उत्पन्न सभी संख्याओं को रखना और उन्हें औसत बनाना होगा: जो काम करेगा लेकिन बहुत ही अक्षम है। थोड़ी सोच के बाद मैं निम्नलिखित के साथ आया (जो मूल रूप से एक संचयी चलती औसत है )।
निम्नलिखित PRNG नमूने लें (जहां हम नमूना है अगर नमूना = = 0.5):
Values: 0.1, 0.5, 0.9, 0.4, 0.8
Events: 0 , 1 , 1 , 0 , 1
Percentage: 60%
ध्यान दें कि प्रत्येक मूल्य अंतिम परिणाम के 1/5 में योगदान देता है। आइए इसे दूसरे तरीके से देखें:
Values: 0.1, 0.5
Events: 0 , 1
ध्यान दें कि 0
मूल्य के 1
५०% का योगदान है और मूल्य के ५०% का योगदान है। थोड़ा और आगे ले जाया गया:
Values: [0.1, 0.5], 0.9
Events: [0 , 1 ], 1
अब पहले मान 66% मूल्य और अंतिम 33% योगदान करते हैं। हम मूल रूप से इसे निम्न प्रक्रिया में परिवर्तित कर सकते हैं:
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
अब हमें PRNG से प्राप्त मूल्य के परिणाम को पूर्वाग्रह करने की आवश्यकता है, क्योंकि हम एक प्रतिशत संभावना के लिए जा रहे हैं यहां चीजें बहुत आसान हैं (बनाम, एक आरटीएस में नुकसान की यादृच्छिक मात्रा)। यह समझाना मुश्किल हो रहा है क्योंकि यह 'अभी मेरे साथ हुआ है'। यदि औसत कम है तो इसका मतलब है कि हमें घटना घटने और वीज़ा-वर्सा की संभावना बढ़ाने की आवश्यकता है। तो कुछ उदाहरण
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%
अब जो 'मेरे साथ हुआ' वह यह है कि पहले उदाहरण में 83% "0.6 में से 0.5" था (दूसरे शब्दों में "0.5 में से 0.5 प्लस 0.1")। यादृच्छिक घटना के संदर्भ में जिसका अर्थ है:
procced = (sample * 0.6) > 0.1
// or
procced = (sample * 0.6) <= 0.5
तो एक घटना उत्पन्न करने के लिए आप मूल रूप से निम्नलिखित कोड का उपयोग करेंगे:
total = average + desired
sample = rng_sample() * total // where the RNG provides a value between 0 and 1
procced = sample <= desired
और इसलिए आपको वह कोड मिलता है जो मैंने जीस्ट में रखा था। मुझे पूरा यकीन है कि यह सब यादृच्छिक क्षति के मामले में उपयोग किया जा सकता है, लेकिन मुझे यह पता लगाने में समय नहीं लगा है।
डिस्क्लेमर: यह सभी घर में काम आने वाले आँकड़े हैं, मेरी कोई शिक्षा नहीं है। मेरी इकाई परीक्षण हालांकि पास करते हैं।