मैंने कई सालों तक प्रोग्राम किया है, और अब जो मुद्दा मैं प्रस्तुत कर रहा हूं वह शायद सबसे अजीब बातों में से एक है।यादृच्छिक संख्या जीन डब्ल्यू/बीज अभिनय गैर-निर्धारक
मेरे एप्लिकेशन में कोड का एक खंड जो बेतरतीब ढंग से तीन संभावित प्रकार के साथ, टोकन के एक अनुक्रम उत्पन्न करता है, मान लें कि ए, बी या सी
ABCCAAABACतो 10 टोकन हो सकता हैं।
कोड के ब्लॉक की शुरुआत में, यादृच्छिक संख्या जनरेटर बीज तो जैसे initialised है:
math.randomseed(seed)
math.random()
अब, आश्चर्य जब बीज मूल्य स्थिर रहती है, मैं हमेशा टोकन के उसी क्रम मिलता है, क्योंकि यादृच्छिक पीढ़ी कोड एक निर्धारिक तरीके से निष्पादित करता है। खैर, लगभग हमेशा।
असल में, दुर्लभ मौकों पर, नीले रंग से, मुझे एक ही बीज दिया गया एक अलग यादृच्छिक अनुक्रम मिलेगा। इससे पहले कि मैं इसे जानता हूं, यह सामान्य हो गया है। आप शायद सोच रहे हैं - आह, दुष्प्रभाव, यह शायद एक राज्य से संबंधित समस्या है जिससे कोड का ब्लॉक जो टोकन के यादृच्छिक अनुक्रम उत्पन्न करता है वह एक चर का उपयोग करता है जो यह बदलता है कि random()
(उदाहरण के लिए) कितनी बार कॉल करता है। हालांकि, मैं 99% निश्चित हूं कि मैंने सभी स्पष्ट साइड इफेक्ट्स के लिए नियंत्रित किया है। कोड के ब्लॉक में केवल कुछ स्थान हैं जो बाहरी राज्य तक पहुंचते हैं, और वे सभी स्थिर रहते हैं।
प्लॉट और भी मोटा हो जाता है - यह समस्या केवल मेरे द्वारा बनाई जा रही ऐप की एंड्रॉइड परिनियोजन पर स्पष्ट है। माना जाता है कि यह एक दुर्लभ बग है, और मैं इसे विश्वसनीय रूप से दोहराने के लिए प्रतीत नहीं कर सकता। तो यह आईओएस तैनाती में भी मौजूद हो सकता है। लेकिन मुझे अभी तक अन्य प्लेटफॉर्म पर नहीं आना है। मैं यह भी उल्लेख कर सकता हूं कि ऐप विकसित करने के लिए मैं कोरोना एसडीके के माध्यम से लुआ स्क्रिप्टिंग का उपयोग कर रहा हूं।
मैं इस मुद्दे को बहुत विचार किया है, और कुछ संभावनाएं करने के लिए इसे नीचे संकुचित है: एक और धागा है जो एक ही यादृच्छिक संख्या जनरेटर है, जो मैं
- इंटरेक्शन lua में यह भी संभव है?) ढेर भ्रष्टाचार के दौरान किसी प्रकार अजीब साइड इफेक्ट के लिए अग्रणी
- मैं में गड़बड़ कर दिया है और वहाँ जो मैं डिबगिंग के कई घंटे भर नहीं छूटा है बाहरी राज्य के लिए कुछ लानत स्पष्ट संदर्भ है है
यह सब का सबसे दर्दनाक पहलू बग की गैर-दोहराने योग्यता है। अधिकांश समय कोड का ब्लॉक पूरी तरह से निर्धारित रूप से एक बार-बार बीज दिया जाता है। फिर ऐसा लगता है कि गैर-निर्धारणवाद के चरण है, जो तब कुछ अज्ञात समय के बाद फिर से समाप्त हो जाता है। मुझे यहां एक विशेषज्ञ के दिमाग चुनना अच्छा लगेगा।
यहां क्या हो सकता है? साथ ही - क्या यह संभव है कि इस विशेष मुद्दे के साथ कुछ भी प्लेटफ़ॉर्म विशिष्ट हो, क्योंकि मैंने इसे केवल एंड्रॉइड परिनियोजन पर देखा है?
संदर्भ के लिए, यहां कोड का पूरा ब्लॉक है। यह वास्तव में दो यादृच्छिक गुणों (तीन रंगों में से एक, और तीन आकारों में से एक) के साथ टोकन उत्पन्न कर रहा है, लेकिन इसका मतलब समस्या के सार के संदर्भ में बहुत अधिक नहीं है।
math.randomseed(currentRandomSeed)
math.random()
local tokenListPlan = {}
-- randomly assign weighting distribution
local thresh1, thresh2
while (true) do
local s0 = math.random(1, 99)
local s1 = math.random(1, 99)
local c0 = s0
local c1 = s1 - c0
local c2 = 100 - c1 - c0
if (c0 >= eng.DEVIATION_THRESHOLD and c1 >= eng.DEVIATION_THRESHOLD and c2 >= eng.DEVIATION_THRESHOLD) then
thresh1 = c0
thresh2 = c0 + c1
break
end
end
-- generate tokens (deterministic based on seed)
for i = 1, sortedCountTarget do
local token
local c = 1
local rnd = math.random(1, 100)
if (rnd < thresh1) then -- skewed dist
c = 1
elseif (rnd < thresh2) then
c = 2
else
c = 3
end
if (paramGameMode == eng.GAME_MODE_COLOR) then
local rnd46 = math.random(4, 6)
token = {color = c, shape = rnd46}
elseif (paramGameMode == eng.GAME_MODE_SHAPE) then
local rnd13 = math.random(1, 3)
token = {color = rnd13, shape = c + 3}
else
local rnd13 = math.random(1, 3)
local rnd46 = math.random(4, 6)
token = {color = rnd13, shape = rnd46}
end
tokenListPlan[#tokenListPlan + 1] = token
end
जहां आप वास्तव में यादृच्छिक सेट करते हैं? यह हो सकता है कि, एंड्रॉइड में, यादृच्छिक सेटिंग लाइन किसी भी कारण से एक से अधिक बार चलती है। – muratgu
कोड के ब्लॉक (बीच में कुछ भी नहीं) से पहले, मैं यहां पोस्ट को कम अस्पष्ट होने के लिए संपादित कर दूंगा। दुर्भाग्य से मैं किसी भी तरह से इसे एक से अधिक बार निष्पादित नहीं कर सकता, विशेष रूप से स्पोरैडिक रूप से नहीं ... –
कुछ मामलों में गणित। यादृच्छिक आग इस कोड के चलते समय अपेक्षित राशि से अधिक है? इसे एक फ़ंक्शन में लपेटने का प्रयास करें जो उस राशि को गिनने के लिए बंद करने का उपयोग करता है जिसे इसे कहा जाता है। देखें कि जब आप अलग-अलग परिणाम प्राप्त करते हैं तो यह बदल जाता है या नहीं। – warspyking