मैं छद्म यादृच्छिक के विपरीत "आनंदपूर्वक" यादृच्छिक उत्पादन कैसे करता हूं?


26

मैं एक ऐसा खेल बना रहा हूं, जो कई तरह की पहेलियों को क्रम से प्रस्तुत करता है। मैं एक छद्म आयामी संख्या के साथ प्रत्येक पहेली का चयन करता हूं। प्रत्येक पहेली के लिए, कई विविधताएँ हैं। मैं एक और छद्म आयामी संख्या के साथ भिन्नता का चयन करता हूं। और इसी तरह।

बात यह है, जबकि यह निकट-सत्य यादृच्छिकता पैदा करता है, यह वह नहीं है जो खिलाड़ी वास्तव में चाहता है। खिलाड़ी आमतौर पर चाहते हैं कि वे जो कुछ भी समझते हैं और यादृच्छिक के रूप में पहचानें, लेकिन केवल अगर यह पहेली को दोहराने के लिए नहीं है। तो, वास्तव में यादृच्छिक नहीं। बस अप्रत्याशित है।

इसे कुछ सोचकर, मैं इसे करने के आसान तरीकों की कल्पना कर सकता हूं। उदाहरण के लिए, नई पसंद का चयन करते समय संभावनाओं के सेट से सबसे हाल के एन विकल्पों को अस्थायी रूप से समाप्त करना। या हर पसंद को एक समान संभावना प्रदान करना, चयन पर शून्य की पसंद की संभावना को कम करना और फिर प्रत्येक चयन के साथ सभी संभावनाओं को धीरे-धीरे बढ़ाना।

मुझे लगता है कि ऐसा करने का एक स्थापित तरीका है, लेकिन मुझे अभी शब्दावली नहीं पता है इसलिए मैं इसे नहीं पा सकता हूं। किसी को पता है? या क्या किसी ने मनभावन तरीके से इसका हल निकाला है?


4
पुस्तक "एआई गेम प्रोग्रामिंग विजडम 2" में फ़िल्टर किए गए यादृच्छिकता पर एक अध्याय है, जो मुझे याद है, से बिल्कुल वही है जो आप देख रहे हैं। मेरे पास यह फिलहाल नहीं है, हालांकि मैं वास्तव में आपको पूरा जवाब नहीं दे सकता।
एंटोन

कोशिश करने और स्पष्ट करने के लिए: जब आप कहते हैं 'रिपीट पज़ल्स नहीं' तो क्या आपका मतलब है कि आप एक दूसरे के बगल में एक ही प्रकार की दो पज़ल नहीं चाहते हैं? तो दूसरे शब्दों में, यदि आपने सिर्फ एक सुडोकू चुना है, तो दूसरी सुडोकू पहेली की पेशकश न करें, लेकिन अगर यह सुडोकू # 19 है, तो पिकाक्रोस # 19 अगले की पेशकश करना ठीक है (दूसरे शब्दों में, विविधता संख्या कोई फर्क नहीं पड़ता) ?
स्टीवन स्टडनिक

2
बहुत संबंधित प्रश्न: stackoverflow.com/questions/910215/…
क्रिस बर्ट-ब्राउन

1
ठीक है, एआई गेम प्रोग्रामिंग विजडम 2 की मेरी कॉपी अभी आई। मैंने फ़िल्टर किए गए यादृच्छिकता के अध्याय को पढ़ा और स्रोत कोड की जाँच की। यह शायद सबसे अच्छा तरीका है। यह मुझे केवल यादृच्छिक संख्याओं का उपयोग करने की अनुमति देता है, लेकिन फिर संख्याओं को फ़िल्टर करें ताकि अप्रत्याशित पैटर्न न हो। यह शफल बैग की तुलना में अधिक बुलेट प्रूफ लगता है।
हिल्टन कैंपबेल

1
फिर भी एक और अद्यतन ... मेरे विशेष अनुप्रयोग के लिए, फ़िल्टर किए गए यादृच्छिकता ने ऐसा नहीं किया। मैं वास्तव में चाहता हूं कि खिलाड़ी दोहराने से पहले सभी प्रकार और उपप्रकारों के माध्यम से खेले, इसलिए मैं एक फेरबदल बैग के साथ गया।
हिल्टन कैंपबेल

जवाबों:


25

यदि आपके पास पहेलियों की सीमित संख्या है, तो आप कर सकते हैं:

  • पहेली की एक सूची बनाएं, या तो उन सभी को या कुछ बेतरतीब ढंग से उठाए गए;
  • इस सूची में फेरबदल ( उदाहरण के लिए नथ शफल देखें );
  • अपने खिलाड़ी को इस सूची के माध्यम से खेलने दें;
  • जब सूची खाली हो, तो एक नई शुरुआत करें।

संपादित करें

मुझे यह नहीं पता था, लेकिन ब्राउज़िंग एसई ने मुझे एहसास दिलाया कि यह वास्तव में "फेरबदल बैग" के रूप में जाना जाता है। कुछ और infos यहाँ , यहाँ या वहाँ

EDIT 2

क्लासिक नथ शफल इस तरह से जाता है:

To shuffle an array a of n elements (indices 0..n-1):
    for i from n  1 down to 1 do
        j  random integer with 0  j  i
        exchange a[j] and a[i]

स्टीवन स्टैडनिक ने अपनी टिप्पणी में ठीक ही कहा है कि इस तरह की बात से फेरबदल पर रोक नहीं है। इसे ध्यान में रखने का एक तरीका अंतिम वस्तु के लिए एक विशेष मामला जोड़ना है:

To reshuffle an array a of n elements and prevent repetitions (indices 0..n-1):
    return if n <= 2

    // Classic Knuth Shuffle for all items *except* the last one
    for i from n  2 down to 1 do
        j  random integer with 0  j  i
        exchange a[j] and a[i]

    // Special case for the last item
    // Exchange it with an item which is *not* the first one
    r  random integer with 1  r  n - 1
    exchange a[r] and a[n - 1]

1
यह काम कर सकता है लेकिन आपको थोड़ा सावधान रहना होगा यदि आप हर नाटक के बाद फेरबदल करते हैं तो उसी आइटम के साथ शुरू न करें जिसे आपने समाप्त किया था।
स्टीवन स्टडनिक

@ सच इस आइटम को नई सूची से बाहर रखा जा सकता है। वास्तव में, यह केवल कुछ यादृच्छिक वस्तुओं की सूची बनाने और केवल शेष वस्तुओं के साथ अगली सूची बनाने का विचार हो सकता है। इसलिए यदि आपके पास 100 आइटम हैं, उदाहरण के लिए 10. की एक फेरबदल सूची का निर्माण करें। जब इस सूची के साथ किया जाता है, तो 90 में 10 आइटम के साथ अगले एक का निर्माण करें जो पहले नहीं उठाए गए थे।
लॉरेंट कौविदो

+1। इस तकनीक को "अधिक मजेदार" होने के लिए जोड़ा गया समर्थन: यह है कि कैसे टेट्रिस, उदाहरण के लिए, "यादृच्छिक" टुकड़े का उत्पादन करता है। प्रत्येक टुकड़े में से एक का एक सेट फेरबदल किया जाता है और इसके माध्यम से पुनरावृत्त होता है, जो डुप्लिकेट के लंबे अनुक्रम से बचा जाता है कि सही यादृच्छिकता अनिवार्य रूप से उत्पन्न होगी।
कुटलुमाइक

1
@ हिल्टन को मैं इस तरह की "नापसंद" करता हूं, जब तक कि लूप यादृच्छिक न हो जाए, जो मुझे चाहिए "दृष्टिकोण" ... बहुत संभावना नहीं है कि यह किसी भी परेशानी का कारण होगा। लेकिन फिर भी, मुझे हमेशा ऐसा लगता है कि यह रैंडम इनफिनिट लूप या परफॉर्मेंस ड्रॉप्स के लिए एक कॉल है - जो डीबग करने के लिए भयानक हैं। पिछली सूची के अंतिम आइटम को नए से अलग करने से आप केवल एक ही बार फेरबदल कर सकते हैं, उसी परिणाम के लिए।
लॉरेंट कौविदो

1
आप सही कह रहे हैं, और मेरे पास एक ही आरक्षण था। पिछले पिछले आइटम को बाहर करने के बजाय, मेरे पास अब केवल एक बार फेरबदल करना है, और फिर यदि पिछले अंतिम आइटम अब पहले है, तो मैं इसे किसी अन्य आइटम के साथ यादृच्छिक रूप से स्वैप करता हूं।
हिल्टन कैंपबेल

2

लोरैंको के दृष्टिकोण पर एक प्रकार: प्रत्येक पहेली प्रकार के लिए, एक (फेरबदल) पहेली संख्या की एक सरणी रखें; फिर हर बार जब आप उस प्रकार की एक पहेली मारते हैं, तो सूची से अगला नंबर प्राप्त करें। उदाहरण के लिए, मान लें कि आपके पास सुडोकू, पिकॉस और केनकेन पहेलियाँ हैं, जिनमें से प्रत्येक में पहेलियाँ # 1..6 हैं। आप संख्या 1..6 के तीन फेरबदल सरणियों का निर्माण करेंगे, प्रत्येक पहेली प्रकार के लिए एक:

  • सुडोकू: [५, ६, १, ३, ४, २]
  • Picross: [6, 2, 4, 1, 3, 5]
  • केनकेन: [३, २, ५, ६, ४, १]

अब, आप पहेली प्रकारों में फेरबदल करेंगे जैसे लोरेंकू सुझाव देते हैं; मान लीजिए कि यह [पिक्रोस, सुडोकू, केनकेन] आता है। फिर हर बार जब आप किसी दिए गए प्रकार की पहेली को मारते हैं, तो उसकी 'फेरबदल सूची' में अगले नंबर का उपयोग करें; कुल मिलाकर आपकी पहेली प्रस्तुति [सुडोकू # ५, चित्रक # ६, केनकेन # ३, सुडोकू # ६, पिक्रास # २, केनकेन # २, ...]

यदि आप लूप के माध्यम से पहेली को हर बार एक ही समग्र क्रम में नहीं रखना चाहते हैं, तो मुझे लगता है कि आपका 'बेतरतीब ढंग से चयन करें, पिछले कुछ पिक्स' विकल्प को नजरअंदाज करना सबसे अच्छा है। ऐसे तरीके हैं जिनसे आप इसे थोड़ा और अधिक कुशल बना सकते हैं; उदाहरण के लिए, मान लें कि आपके पास 20 चीजें हैं और आप अंतिम 5 को चुनना चाहते हैं। फिर बेतरतीब ढंग से नंबर 1..20 चुनने और 'rerolling' के बजाय जब तक कि आप अंतिम 5 के बाहर एक न हो जाएं, इसके बजाय बस एक नंबर 1..15 चुनें और अपनी पहेली प्रकारों के माध्यम से चलें जो कई चरणों में, बस किसी भी पहेली प्रकार पर लंघन करना है उठाया गया है (आप अंतिम 5 चुनी गई पहेलियाँ रखने वाले बिट सरणी को रखकर आसानी से ऐसा कर सकते हैं)।

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