UnityEngine.Random और System.Random में क्या अंतर है?


24

इसके बीच क्या अंतर है

int randomNumber = UnityEngine.Random.Range(0, 10);

और इस

// on top of the class
private System.Random _rnd = new System.Random();

// inside a methode of the same class
int randomNumber = _rnd.Next(0, 10);

मुझे पता है कि System.Randomहमेशा अपनी कक्षा के शीर्ष पर आरंभीकृत होना चाहिए जो इसके द्वारा UnityEngine.Randomआवश्यक नहीं है। मुझे यह भी पता है कि System.Randomएक इंटर्न "क्लॉक" के साथ काम करता है और "रैंडम" नंबर उसी पर आधारित है।

मेरा प्रश्न है वहाँ के बीच कुछ अन्य अंतर कर रहे हैं UnityEngine.Randomऔर System.Randomऔर चुड़ैल कोड एक एकता परियोजना के लिए उपयोग करने के लिए बेहतर है?

जवाबों:


23

संभवतः सबसे महत्वपूर्ण अंतर यह है कि एकता का Random.Rangeस्थिर होना थोड़ा आसान है। C # बेस क्लास लाइब्रेरी System.Random, हालाँकि, आपको अधिक नियंत्रण और अलगाव प्रदान करती है।

यह संभव है कि वे अलग-अलग अंडर-हूड कार्यान्वयन का उपयोग करें (हालांकि मेरा अनुमान है कि यूनिटी Randomको सिस्टम के संदर्भ में लागू किया गया है Random), लेकिन यह संभवतः एक उल्लेखनीय चिंता का विषय नहीं है। मौलिक रूप से वे दोनों एक ही प्रकार के यादृच्छिक संख्या जनरेटर की संभावना रखते हैं : एक छद्म यादृच्छिक जनरेटर जो किसी बीज द्वारा परिभाषित अनुक्रम को पुनरावृत्त करने पर आधारित है)।

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

इसी तरह, यदि आप कई थ्रेड्स में रैंडम नंबर जेनरेट करने जा रहे हैं, तो आप चाहें तो रेस की परिस्थितियों को रोकने के लिए प्रत्येक थ्रेड के लिए अलग-अलग रैंडम ऑब्जेक्ट्स का उपयोग कर सकते हैं। यह तब हो सकता है जब आपका गेम लॉजिक कई थ्रेड्स पर चलता है और उदाहरण के लिए आपके पास गेमप्ले रीप्ले सिस्टम भी है।

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


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

3
@GregRos अच्छा नोट है, लेकिन यह इस आलेख में वर्णित के अनुसार एक अलग तरह का सेव- स्कमिंग पेश कर सकता है - मूल रूप से एक ही चाल को फिर से प्रयास करने के बजाय जब तक कि वे एक सफल रोल नहीं करते हैं, खिलाड़ी चालों के अलग-अलग क्रमों की कोशिश करता है जब तक कि चालें उनकी जमीन की परवाह नहीं करती हैं पूर्व-निर्धारित अनुक्रम में सफल रोल पर। यह पता चलता है कि बचत के साथ किसी भी प्रणाली में सेस्कुम के तरीके हैं। स्कमर्स गोना स्कम, इसलिए कभी-कभी यह प्रवाह के साथ जाने के लिए समझ में आता है जैसा कि एक्सकॉम ने किया था
DMGregory

10

UnityEngine.Random उपयोग के फायदे में कुछ आसानी है:

  • स्टैटिक / ग्लोबली एक्सेसिबल - आपको प्रत्येक ऑब्जेक्ट या सिस्टम के लिए एक उदाहरण बनाने की आवश्यकता नहीं होती है जिसे यादृच्छिकता की आवश्यकता होती है। आपकी अधिकांश या सभी स्क्रिप्ट इस संसाधन को साझा कर सकती हैं।

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

(मुझे इस बारे में कोई पुष्टि नहीं मिली है कि UnityEngine.Random सिस्टम के मोनो कार्यान्वयन से अलग किसी भी क्रॉस-प्लेटफ़ॉर्म स्थिरता की गारंटी प्रदान करता है - वे हुड के नीचे एक ही हो सकते हैं या नहीं भी हो सकते हैं)

ऐसा करने के लिए आप निश्चित रूप से अपनी खुद की कक्षा का निर्माण कर सकते हैं जो System.Random (या किसी अन्य लाइब्रेरी, या अपने खुद के PRNG) का उपयोग करता है, लेकिन अच्छा हिस्सा यह है कि - एकता के कार्यान्वयन का मतलब आपके लिए एक अच्छी आधार रेखा देना नहीं है बॉक्स के बाहर यादृच्छिक व्यवहार।

कहा कि, ऐसे मामले हैं जहाँ आप यादृच्छिकता के अन्य स्रोतों का उपयोग करना चाहते हैं:

  • यदि आप कई थ्रेड्स का उपयोग कर रहे हैं, तो विवाद से बचने के लिए प्रत्येक थ्रेड में छद्मता का अपना स्रोत होना चाहिए (UnityEngine.Random केवल मुख्य धागे पर उपलब्ध है)

  • यदि आपको एक नियतात्मक छद्म आयामी अनुक्रम की आवश्यकता होती है (उदाहरण के लिए एक बीज स्तर जनरेटर के लिए) तो आप शायद उस प्रणाली को छद्मत्व का अपना स्रोत चाहते हैं जिसे कोई अन्य स्क्रिप्ट नहीं प्राप्त कर सकती है, ताकि निष्पादन के क्रम में अंतर का कारण न बने। संख्या छोड़ें और उस नियतत्ववाद को तोड़ें जिस पर आप गिन रहे थे। अधिक जानकारी के लिए, अंकुरित यादृच्छिक संख्याओं के बारे में एकता ब्लॉग पर एक शानदार पोस्ट है

  • यदि आपको सुरक्षा, जुआ, या अद्वितीय आईडी बनाने के लिए क्रिप्टोग्राफिक रूप से मजबूत यादृच्छिकता की आवश्यकता है, तो आपको इस उद्देश्य के लिए विशेष पुस्तकालयों का उपयोग करना चाहिए। न तो UnityEngine.Random और न ही System.Random पर्याप्त गुणवत्ता की गारंटी प्रदान करते हैं।


हूप्स, जोसेपेट्री और जॉन से माफी मांगता है - मैंने इसे मोबाइल पर टाइप करते समय लिया था, इसलिए मैंने आपके उत्तर तब तक नहीं देखे जब तक मैंने इसे पोस्ट नहीं किया। ऐसा लगता है कि हम सभी समान जमीन को कवर कर चुके हैं।
DMGregory

क्रिप्टो-ग्रेड यादृच्छिकता के लिए RNGCryptoServiceProvider देखें, लेकिन यह ध्यान में रखें कि यह बहुत धीमा है और यह एकता के सभी छीनने वाले .NET प्लेटफ़ॉर्म से बाहर रखा गया है।
McGuireV10

6

UnityEngine.Random स्थिर है। यदि आप एक यादृच्छिक संख्या जनरेटर के कई उदाहरण बनाना चाहते हैं, तो आप System.Random का उपयोग करना चाहेंगे।

एकता कार्यान्वयन के लिए स्रोत कोड को देखने का कोई तरीका नहीं है, हालांकि, Microsoft System.Random के लिए स्रोत प्रदान करता है ।


3
ऐसा नहीं है कि Microsoft का स्रोत एकता द्वारा उपयोग किया जाने वाला नहीं है। आपको इसके बजाय मोनो स्रोत को देखना चाहिए।
आर्टुरो टॉरेस सैंचेज़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.