क्या यूनिटी 2017 रैंडम नंबर जेनरेटर निर्धारक प्लेटफॉर्मों पर एक ही प्रारंभिक बीज दिया गया है?


17

क्या प्लेटफ़ॉर्म भर में एकता इंजन रैंडम नंबर जनरेटर नियतात्मक है जिसे एक ही प्रारंभिक बीज दिया गया है या क्या मुझे अपना स्वयं का कार्यान्वयन करना चाहिए?

मुझे पता है कि हाल ही में यादृच्छिक संख्या जनरेटर के लिए कुछ संशोधन हुए हैं।

उत्तर की सराहना की जाती है, मेरे पास किसी भी परीक्षण को करने के लिए डिवाइस नहीं हैं और मुझे अभी तक इस मामले पर एक सीधा बयान नहीं मिला है।


11
अच्छा प्रश्न। लेकिन जब आपका खेल नियतात्मक प्रक्रियात्मक पीढ़ी पर निर्भर करता है, तो आप वैसे भी कभी भी अपने एल्गोरिथ्म को बदलने का फैसला करने की स्थिति में अपने खुद के PRNG प्रोग्राम करना चाह सकते हैं। दस्तावेज़ एल्गोरिथ्म का दस्तावेज़ नहीं करता है, इसलिए आपको कोई गारंटी नहीं लेनी चाहिए।
फिलिप

1
मुझे आपकी बात समझ में आ रही है, लेकिन इस पर काम करने के लिए पर्याप्त काम है, मैं अभी यह जानना चाहता हूं कि राज्य की एकता का PRNG अभी क्या है और लाइन के नीचे भविष्य के प्रमाण संस्करण प्रदान करें। बिना जाने इसका उपयोग करने से कुछ वास्तव में निराशा हो सकती है। आपके सुझाव के लिए धन्यवाद।
अनन्तनाउब

2
मैं दूसरी @ फिलिप की सलाह। यदि आपको एक नियतात्मक RNG की आवश्यकता है, तो आपको अपना खुद का लेखन (और इसे परीक्षण) में निवेश करना चाहिए। यदि आप कभी भी एक नया एकता संस्करण का उपयोग करने की आवश्यकता है और RNG फिर से बदल गया है, तो आप चोट की दुनिया में होंगे। ऐसा होने पर आपके लिए उसी RNG को फिर से बनाना असंभव हो जाएगा और पिछले बचत / दुनिया के साथ अनुकूलता बनी रहेगी।
स्टीफन होकेनहुल

5
मुझे लगता है कि सलाह एक जवाब के रूप में लिखने के लायक होगी, "चाहे वह अभी निर्धारित नहीं है या नहीं है, इस पर हमेशा एक ही होने की गिनती मत करो" (यदि आप में से कोई भी इतना इच्छुक होगा - मैं नहीं चाहता हूं तेरी चोरी)। );: कुछ जाहिरा तौर पर हाँ या ना सवाल बेहतर "अन्य विकल्प सी 'के साथ उत्तर दिया जाता है
DMGregory

जवाबों:


8

हालांकि मेरे पास कोई व्यापक परीक्षण करने का समय नहीं है, प्रारंभिक शोध से पता चलता है कि उपयोग किए गए यादृच्छिक संख्या जनरेटर विभिन्न प्लेटफार्मों में नियतात्मक है। उपयोग किया गया सटीक कार्यान्वयन है: एकता PRNG । यह भी देखें: विभिन्न हार्डवेयर पर एकता यादृच्छिक बीज
यूनिटी Randomवर्ग के साथ, PRNG की सटीक स्थिति को बचाया जा सकता है, देखें: यूनिटी रैंडम सैट


7

थॉमस ने पूछे गए सवाल का जवाब दिया। अधिक महत्वपूर्ण प्रश्न इस प्रकार है:

क्या एकता 2017 यादृच्छिक संख्या जनरेटर को सभी मौजूदा और भविष्य के प्लेटफार्मों पर एक ही नंबर देने के लिए समान बीज देने की गारंटी है, और क्या यह एकता के भविष्य के रिलीज के समान संख्याओं को वितरित करने की गारंटी है?

इस मामले के होने की संभावना अधिक है, लेकिन यह गारंटी के समान नहीं है। तो जवाब, दुर्भाग्य से, " नहीं, यह नहीं है "। रैंडम के प्रलेखन में एक गारंटी को स्पष्ट रूप से कहा जाना चाहिए , लेकिन वर्तमान में ऐसी कोई बात नहीं है।

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


4

Unity 2017.2.0f3 का उपयोग करते हुए, UnityEngine.Random कई प्लेटफार्मों पर समान परिणाम देता है। विंडोज 10, मैकओएस 10.12 सिएरा और एंड्रॉइड 7 पर परीक्षण किया गया।

परीक्षण करने के लिए, मैंने एक सीडफैक्ट्री वर्ग की छंटनी की है जिसे मैंने बनाया है:

using UnityEngine;

public class SeedFactory {

    private Random.State state;

    public SeedFactory (int seed) {
        Random.InitState(seed);
        state = Random.state;
    }

    // Set Unity's global Random state with this SeedFactory's state, get a random int,
    // then set our SeedFactory's state with the new state.
    // (this allows us to use multiple SeedFactories for multiple paths of determinism
    // if desired)
    public int GetRandomInt (int minInclusive, int maxExclusive) {
        Random.state = state;
        int randomInt = Random.Range(minInclusive, maxExclusive);
        state = Random.state;
        return randomInt;
    }

}

और एक MonoBehaviour परीक्षण चलाने के लिए:

public class SeedTest : MonoBehaviour {

    void Start () {
        SeedFactory seedFactory = new SeedFactory(123456789);
        string result = "";
        for (int i = 0; i < 20; i++) {
            result += seedFactory.GetRandomInt(int.MinValue, int.MaxValue) + ", ";
        }
        Debug.Log(result);
    }

}

और परिणाम सभी एक ही रहे हैं:

Windows Editor:
217814258, 711215697, 1793372675, -1318111305, -513578644, 1776128467, -1503243711, -285471819, -1800526065, -1845985472, -2061970588, 188207569, 1858341351, -1139513088, 2136219157, 1255727479, -2070068486, 459175680, 1151694536, 1232856178, 

Windows Standalone:
217814258, 711215697, 1793372675, -1318111305, -513578644, 1776128467, -1503243711, -285471819, -1800526065, -1845985472, -2061970588, 188207569, 1858341351, -1139513088, 2136219157, 1255727479, -2070068486, 459175680, 1151694536, 1232856178,

macOS Standalone:
217814258, 711215697, 1793372675, -1318111305, -513578644, 1776128467, -1503243711, -285471819, -1800526065, -1845985472, -2061970588, 188207569, 1858341351, -1139513088, 2136219157, 1255727479, -2070068486, 459175680, 1151694536, 1232856178,

Android:
217814258, 711215697, 1793372675, -1318111305, -513578644, 1776128467, -1503243711, -285471819, -1800526065, -1845985472, -2061970588, 188207569, 1858341351, -1139513088, 2136219157, 1255727479, -2070068486, 459175680, 1151694536, 1232856178,
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.