मैं यादृच्छिक संख्या में "बहुत" भाग्यशाली / अशुभ धारियों से कैसे बचूं?


30

मैं वर्तमान में एक मल्टीप्लेयर मुकाबला प्रणाली के साथ काम कर रहा हूं, जहां खिलाड़ियों द्वारा नुकसान को हमेशा 0.8 और 1.2 के बीच एक यादृच्छिक कारक से गुणा किया जाता है।

सिद्धांत रूप में, वास्तव में यादृच्छिक RNG अंततः एक ही संख्या को कई बार प्राप्त कर सकता है ( टेट्रिस दुविधा देखें )। इसके परिणामस्वरूप एक मैच हो सकता है जहां खिलाड़ी हमेशा बहुत अधिक नुकसान कर रहा है जबकि दूसरा हमेशा बहुत कम नुकसान करता है।

मैं यह सुनिश्चित करने के लिए क्या कर सकता हूं कि ऐसा नहीं होता है? क्या पुनरावृत्ति से बचने के लिए कुछ आरएनजी दूसरों की तुलना में बेहतर हैं?


मैं यह नहीं देखता कि यह कैसे काम करता है। बेशक आप X1, x2, x3, x4 .. का क्रम प्राप्त करने जा रहे हैं, जहाँ सभी x बड़े हैं। हालांकि यह अभी यादृच्छिक नहीं है?
कम्युनिस्ट डक

जवाबों:


26

आप इसे उसी तरह से हल कर सकते हैं जैसे टेट्रिस करता है, नुकसान के परिणामों की पूर्व निर्धारित सूची बनाकर और फेरबदल करके।

मान लीजिए कि आपको पता है कि खिलाड़ी एक रैखिक वितरण के साथ 0.8x से 1.2x की क्षति से निपटने जा रहा है। सूची ले लो [0.8, 0.9, 1.0, 1.1, 1.2]। इसे बेतरतीब ढंग से फेरबदल करें , इसलिए आपको उदाहरण मिलता है [1.2, 1.0, 0.8, 0.9, 1.1]।

पहली बार जब खिलाड़ी क्षति का सामना करता है, तो वे 1.2x का सौदा करते हैं। फिर 1x। फिर, आदि, 1.1x करने के लिए। केवल जब सरणी खाली हो, तो आपको एक नया सरणी उत्पन्न करना और फेरबदल करना चाहिए।

व्यवहार में, आप संभवतः 4+ सरणियों को एक बार में करना चाहेंगे (जैसे [0.8,0.8,0.8,0.8,0.9,0.9,0.9,0.9,0.9, ...] से शुरू करें। अन्यथा अनुक्रम की अवधि इतनी कम है कि खिलाड़ी यह पता लगा सकते हैं कि उनकी अगली हिट "अच्छी" है या नहीं। (हालांकि, ड्रैगन क्वेस्ट IX की हूमी तालिका में , मुकाबला करने के लिए और अधिक रणनीति भी जोड़ सकता है , जो लोगों को पता लगा कि कैसे उपचार संख्याओं को देखकर जांच करें और जब तक आप एक दुर्लभ बूंद की गारंटी न दें तब तक ट्वीक करें।)


3
इसे थोड़ा और यादृच्छिक बनाने के लिए आप हमेशा औसत संख्या के रूप में आधी सूची, और दूसरे आधे की गणना (2-x) के रूप में कर सकते हैं।
एडम

2
@ अदम: यह विधि वास्तव में केवल इस विशेष उदाहरण के लिए काम करती है; अगर आप टेट्रिस टुकड़े को नुकसान के गुणकों के बजाय बाहर कर रहे हैं, तो 2 - एस ब्लॉक क्या है?

6
इसके लिए सामान्य शब्द "सिस्टम प्रतिस्थापन के बिना यादृच्छिक" है। यह वास्तव में पासा के बजाय ताश के पत्तों के डेक का उपयोग करने के लिए समान है।
काइलोटन

इससे भी बेहतर, आप वास्तव में यादृच्छिक संख्या में आधे नंबर कर सकते हैं , और उनमें से केवल आधे ही इस नियम के अधीन हैं।
ओ ० '।

1
यह अभी भी स्थानीय वितरण में वैश्विक वितरण जैसा नहीं हो सकता है, जो वास्तव में सवाल नहीं चाहता है। "वास्तव में यादृच्छिक" जैसे शब्द अस्पष्ट pseudomathematics हैं; जितना अधिक आप यह निर्धारित करते हैं कि आप कौन से सांख्यिकीय गुण चाहते हैं, आपका इरादा और गेम डिज़ाइन कितना स्पष्ट होगा।

5

मैंने वास्तव में ऐसा करने के लिए कुछ कोड लिखे थे । इसका सार अस्वाभाविक लकीरों को सही करने के लिए आँकड़ों का उपयोग कर रहा है। जिस तरह से आप कर सकते हैं, वह यह है कि घटना कितनी बार हुई है और 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

और इसलिए आपको वह कोड मिलता है जो मैंने जीस्ट में रखा था। मुझे पूरा यकीन है कि यह सब यादृच्छिक क्षति के मामले में उपयोग किया जा सकता है, लेकिन मुझे यह पता लगाने में समय नहीं लगा है।

डिस्क्लेमर: यह सभी घर में काम आने वाले आँकड़े हैं, मेरी कोई शिक्षा नहीं है। मेरी इकाई परीक्षण हालांकि पास करते हैं।


अपने पहले उदाहरण में एक त्रुटि की तरह दिखता है क्योंकि 0 और घटना में 0.1 और 0.9 मान परिणाम दोनों। लेकिन आप मूल रूप से एक संचयी चलती औसत ( en.wikipedia.org/wiki/Moving_aiture#Cumactory_moving_aiture ) और उसके आधार पर सही रखने का वर्णन कर रहे हैं । एक जोखिम यह है कि प्रत्येक परिणाम पूर्व परिणाम के साथ काफी उलट होगा, हालांकि यह सहसंबंध समय के साथ कम हो जाएगा।
काइलोटन

1
मुझे इसके बजाय 'लीची इंटीग्रेटर' प्रणाली का उपयोग करने के लिए इसे बदलने का प्रलोभन दिया जाएगा: 0.5 से आरंभिक औसत के साथ शुरू करें और गिनती के बजाय नमूनों को मनमाना निरंतर मान (जैसे 10, 20, 50, या 100) चुनें जो कि वृद्धि नहीं करता है। । फिर कम से कम 2 बाद के मूल्यों के बीच संबंध जनरेटर के उपयोग के दौरान स्थिर है। आप निरंतर मूल्य को भी मोड़ सकते हैं - बड़े मूल्यों का अर्थ है धीमी गति से सुधार और अधिक स्पष्ट यादृच्छिकता।
काइलोटन

@ किलोटन धन्यवाद, नाम प्रदान करने के लिए धन्यवाद। मुझे यकीन नहीं है कि आप अपनी दूसरी टिप्पणी के साथ क्या मतलब है - शायद एक नया उत्तर प्रदान करें?
जोनाथन डिकिंसन

यह काफी चालाक है और इसमें सरणियों की सीमाएँ नहीं हैं। मैं Kylotan के सुझाव को समझता हूं, जो कि शुरू samplesसे ही इसके अधिकतम मूल्य (इस मामले में, 100) पर इनिशियलाइज़ करना है। इस तरह, यह RNG को स्थिर करने के लिए 99 पुनरावृत्तियों को नहीं लेता है। किसी भी तरह से, मैं इस पद्धति के साथ एक नुकसान यह देख सकता हूं कि यह निष्पक्षता की गारंटी नहीं देता है , यह बस एक औसत औसत सुनिश्चित करता है।
उपयोगकर्ता

@ जेसेपिया - वास्तव में, आपको अभी भी निष्पक्षता / अनुचितता के रन मिलेंगे, लेकिन एक संतुलित रन के बाद (आमतौर पर) उनका अनुसरण किया जाएगा। उदाहरण के लिए, मेरे यूनिट टेस्ट में मैंने 100 गैर-प्रोक्स को 'मजबूर' किया और असली नमूने के साथ ~ 60 प्रोक्स के साथ मिला। असंबंधित स्थितियों के तहत (यदि आप कोड को देखते हैं) 50% खरीद आमतौर पर, सबसे खराब, दोनों दिशाओं में 2/3 के रन देखता है। लेकिन एक खिलाड़ी के पास एक रन हो सकता है जिससे वह दूसरे खिलाड़ी को हरा सकता है। यदि आप इसे निष्पक्ष रूप से निष्पक्ष रूप से पूर्वाग्रह करना चाहते हैं total = (average / 2) + desired:।
जोनाथन डिकिंसन

3

आप जो पूछ रहे हैं, वह वास्तव में अधिकांश PRNG के विपरीत है, एक गैर-रेखीय वितरण। अपने नियमों में थोड़े से कम रिटर्न वाले लॉजिक को रखें, मान लें कि 1.0x पर सब कुछ किसी तरह का "क्रिटिकल हिट" है, तो बस यह कहें कि क्रिट होने की संभावना के प्रत्येक दौर में एक्स द्वारा ऊपर जाने की संभावना है, जब तक कि आप एक नहीं हो जाते जो बिंदु वे वाई को रीसेट करते हैं। फिर आप प्रत्येक राउंड को दो रोल करते हैं, एक को क्रिट या न निर्धारित करने के लिए, और फिर वास्तविक परिमाण के लिए दूसरा।


1
यह वह सामान्य तरीका है जिसे मैं लेता हूँ, आप RNG के समान वितरण का उपयोग करते हैं लेकिन इसे बदल देते हैं। आप अपने स्वयं के कस्टम वितरण के इनपुट के रूप में RNG के आउटपुट का भी उपयोग कर सकते हैं जो हाल के इतिहास के आधार पर खुद को समायोजित करता है, अर्थात आउटपुट में भिन्नता को मजबूर करने के लिए, ताकि यह मानव धारणा के संदर्भ में "अधिक यादृच्छिक" दिखे।
माइकल

3
मैं वास्तव में एक ऐसे MMO के बारे में जानता हूं जो ऐसा कुछ करता है, लेकिन एक आलोचक का मौका वास्तव में हर बार आपको मिलता है जब तक आपको एक नहीं मिलता है, तब यह बहुत कम मूल्य पर रीसेट करता है। यह आलोचकों की दुर्लभ लकीरों की ओर जाता है जो खिलाड़ी के लिए बहुत संतोषजनक हैं।
कोडरंगर

एक अच्छे अल्ग की तरह लगता है, लंबे सूखे मंत्र हमेशा निराशाजनक रहे हैं, लेकिन यह आलोचकों की पागल लकीरों को जन्म नहीं देता है।
माइकल

2
इसे ठीक करने के लिए गैर-वितरण वितरण की आवश्यकता नहीं होती है, बस इसके लिए आवश्यक है कि वितरण के कम समय-अनुक्रमिक उपसमूह में वितरण के समान गुण हों।

इस तरह से बर्फ़ीला तूफ़ान का खेल है, कम से कम Warcraft 3
dreta

2

इस विषय और सभ्यता के खेलों के बारे में सिड मीयर ने जीडीसी 2010 में एक उत्कृष्ट भाषण दिया था। मैं लिंक को बाद में खोजने और चिपकाने की कोशिश करूंगा। संक्षेप में - कथित यादृच्छिकता सही यादृच्छिकता के समान नहीं है। चीजों को उचित महसूस करने के लिए आपको पिछले परिणामों का विश्लेषण करने और खिलाड़ियों के मनोविज्ञान पर ध्यान देने की आवश्यकता है।

हर कीमत पर बुरी किस्मत की लकीरों से बचें (यदि पिछले दो मोड़ बदकिस्मत थे तो अगले को भाग्यशाली होने की गारंटी दी जानी चाहिए)। खिलाड़ी को हमेशा एआई प्रतिद्वंद्वी की तुलना में भाग्यशाली होना चाहिए।


0

एक शिफ्टिंग पूर्वाग्रह का उपयोग करें

01आर0

समग्र वितरण निम्नलिखित सूत्र द्वारा पक्षपाती होगा:

आरexp(-)

10

इस संख्या को लें और इसे उचित सीमा तक उचित रूप से मापें।

हर बार एक खिलाड़ी पक्षपातपूर्ण तरीके से लुढ़कता है, पूर्वाग्रह से घटता है। हर बार खिलाड़ी प्रतिकूल रोल करता है, पूर्वाग्रह में जोड़ता है। परिवर्तित राशि को कैसे (संयुक्त राष्ट्र) के अनुकूल रोल द्वारा बढ़ाया जा सकता है या एक फ्लैट राशि (या एक संयोजन) हो सकती है। आप जिस मूल्य के लिए जा रहे हैं उसे फिट करने के लिए आपको विशिष्ट मूल्यों को समायोजित करने की आवश्यकता होगी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.