नक्शा पीढ़ी के लिए यादृच्छिक बीज कार्य?


28

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

हालांकि, अगर दुनिया अनंत है, तो एक खिलाड़ी के पास जाने से पहले एक समस्या खड़ी हो गई है। खेल को यह याद रखना चाहिए कि वहाँ सब कुछ वास्तव में कैसा दिखता था।

तो, मैं सोच रहा था - "Minecraft इस मुद्दे को कैसे हल करता है?" और मैंने खुद से सोचा कि वे एक बीज के साथ कुछ प्रकार के यादृच्छिक-संख्या फ़ंक्शन का उपयोग कर रहे होंगे, जो दोनों आगे, बल्कि पीछे की ओर भी जा सकते हैं, और इस तरह, पुरानी टाइलों को ठीक उसी तरह से फिर से उत्पन्न कर सकते हैं जैसे वे थे, लेकिन नए उदाहरणों में।

इस पर आपके विचार क्या हैं?


यह मेरा उत्तर +5 पर कैसा है फिर भी सवाल केवल +2 पर है? यह अभी फ्रंट पेज पर सबसे अच्छे प्रश्नों में से एक है।

2
Minecraft केवल आपके द्वारा पहले से ही देखे गए / संशोधित किए गए चंक्स को स्टोर नहीं करता है?
FxIII

@FxIII: माइनक्राफ्ट को अवश्य देखना चाहिए, क्योंकि आप परिदृश्य को संशोधित कर सकते हैं। यदि आप ऐसा नहीं कर सकते हैं, तो विखंडन को स्टोर करना संभवतः एक बेकार है, या कम से कम एक ओवरकम्प्लिकेशन है।

@ जोए Wrigchnig: ठीक है, ठीक है ... मुझे डर था कि मैं वास्तव में बड़ा कुछ याद किया!
9

जवाबों:


20

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

दोनों बहुत निकट से संबंधित हैं। जैसे - एक शोर समारोह एक अलग मूल्य में हर बार पारित करके एक यादृच्छिक संख्या जनरेटर अनुकरण कर सकते हैं, noise(1), noise(2), और इतने पर। और एक यादृच्छिक संख्या जनरेटर, एक विशाल तालिका में डंप किया गया, एक शोर समारोह के रूप में कार्य कर सकता है। हालाँकि, दोनों ही मामलों में आप नौकरी के लिए गलत टूल का उपयोग कर रहे हैं।

Minecraft विशेष रूप से पेरलिन शोर का उपयोग करता है , एक प्रकार का शोर जो कि गणना करने के लिए सस्ता है, और इसमें कई आयामों में निरंतर रहने की एक वांछनीय संपत्ति है जैसे कि आपको ज़रूरत है - यदि आप ग्राफ़ f(x)करते हैं f(x + 1), तो कोई अचानक कूद नहीं होगा। यह बनावट मॉड्यूलेशन, वॉल्यूमेट्रिक क्लाउड्स और गैसों और इलाके पीढ़ी जैसी कई चीजों के लिए बहुत उपयोगी है।

यदि आप के साथ खेलना शुरू करने के लिए एक कार्यान्वयन की तलाश कर रहे हैं, तो केन पेर्लिन का सुधारित पेर्लिन शोर जनरेटर सबसे सरल कार्यान्वयन में से एक है।


3
ध्यान दें कि बहुत सारे यादृच्छिक संख्या जनरेटर एक बीज का उपयोग करते हैं, और एक ही बीज दिए गए संख्याओं के समान सेट उत्पन्न करेंगे।
थेडियन

3
@thedaian: जो इस मामले में विशेष रूप से उपयोगी नहीं है, जब तक आप हर संख्या को पुन: उत्पन्न नहीं करना चाहते; एक शोर फ़ंक्शन आपको इससे पहले 499 उत्पन्न करने के बिना 500 वां नंबर प्राप्त करने देता है।

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

3
आपने छह मिनट में दिए गए लिंक को पढ़ा और समझा नहीं है।

1
यह उत्तर Notch के ब्लॉग पोस्ट के साथ पूरा हो गया होगा: notch.tumblr.com/post/3746989361/terrain-generation-part-1
deceleratedcaviar

3

जिस तरह से Minecraft अपनी पीढ़ी को नियंत्रित करता है वह एक स्तर के बीज का निर्माण करता है जो खेल के लिए सभी यादृच्छिक संख्या पीढ़ी को बीजने के लिए उपयोग किया जाता है। यदि कोई डिस्क अनुरोध करने पर डिस्क पर मौजूद नहीं होती है, तो यह स्तर के बीज के आधार पर Notch की पीढ़ी के कार्य का उपयोग करके उत्पन्न की जाएगी ; यह बाद में डिस्क के लिए सहेजा गया है।

ऐसा लगता है कि आप समान व्यवहार प्राप्त करना चाहते हैं, इसलिए यह जाने का एक सुरक्षित तरीका है।


2

जैसा कि जे ने बताया, आप एक हैश फ़ंक्शन की तलाश कर रहे हैं। आमतौर पर, रैंडम फ़ंक्शंस बस हैश फ़ंक्शंस होते हैं जो अंतिम रिटर्न नंबर के साथ होते हैं। इसलिए अगर Random()लौटा Hash(seed)=1234, तो दूसरी कॉल Random()वापस आएगी Hash(1234)

यदि आप छद्म यादृच्छिक संख्याओं के लिए एक साधारण हैशिंग फ़ंक्शन की तलाश कर रहे हैं, तो मुरमुराश की जांच करें । मैंने इसे C # में लागू किया है और यदि आप रुचि रखते हैं तो इसे कहीं पोस्ट कर सकते हैं। इस तरह के हैश फ़ंक्शन का उपयोग करने वाले पेर्लिन शोर की अधिक विस्तृत जानकारी यहां पाई जा सकती है , और इसे C # में लागू किया जा सकता है

ये सभी जानकारियां एक सवाल मैं एक साल पहले पूछा से आया है यहाँ स्टैक ओवरफ़्लो पर। जिसे आप देख रहे हैं उसे प्रक्रियात्मक सामग्री पीढ़ी कहा जाता है, इसलिए यदि आपको अधिक जानकारी की आवश्यकता है, तो उसके लिए एक खोज करें। खुश इलाज़ पैदा करने वाला!


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

1
@ जो - मुझे खेद है कि आप पेर्लिन शोर के अपने कार्यान्वयन के बारे में इतनी दृढ़ता से महसूस करते हैं। पेरलिन शोर अपने आप में एक हैश फ़ंक्शन को निरंतर शोर फ़ंक्शन में बदलने की अवधारणा है। मैं बहुत प्रभावी ढंग से मर्मरहैश के साथ बहुत सारे पेरलिन शोर पैदा कर रहा हूं। C # कोड के रूप में, यह एक उदाहरण है कि कैसे 2D Perlin शोर में एक बिंदु के मूल्य को प्रोग्रामेटिक रूप से निर्धारित किया जाए। मैं इसे उत्पादन में कभी इस्तेमाल नहीं करूंगा, लेकिन यह मेरी राय में, आपके द्वारा पोस्ट किए गए कोड की तुलना में चलना आसान है।
dlras2

1
ओपी को शोर या हैशिंग का कोई ज्ञान नहीं था, इसलिए मैंने बस आशाओं में संदर्भ प्रदान करने का प्रयास किया कि वे आगे की जांच करेंगे और यह तय करेंगे कि उन्हें जो भी करना है उसे कैसे लागू करना है।
dlras2

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

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