เครื่องกำเนิดเลขสุ่มแบบ Unity 2017 นั้นสามารถกำหนดข้ามแพลตฟอร์มได้หรือไม่?


17

ตัวสร้างตัวเลขแบบเอกภาพของเอ็นจินเอนจินส์กำหนดขึ้นระหว่างแพลตฟอร์มที่ได้รับเมล็ดเริ่มต้นเดียวกันหรือฉันควรนำไปใช้เองได้หรือไม่?

ฉันรู้ว่ามีการดัดแปลงตัวสร้างตัวเลขสุ่มเมื่อไม่นานมานี้

คำตอบได้รับการชื่นชมฉันไม่มีอุปกรณ์ในมือที่จะทำการทดสอบใด ๆ และฉันยังไม่พบคำสั่งโดยตรงในเรื่องนี้


11
คำถามที่ดี. แต่เมื่อเกมของคุณขึ้นอยู่กับการสร้างโพรซีเดอร์ที่กำหนดคุณอาจต้องการเขียนโปรแกรม PRNG ของคุณเองในกรณีที่ Unity ตัดสินใจเปลี่ยนอัลกอริธึม เอกสารไม่ได้เป็นเอกสารเกี่ยวกับอัลกอริทึมดังนั้นคุณไม่ควรรับการค้ำประกันใด ๆ
ฟิลิปป์

1
ฉันเข้าใจประเด็นของคุณ แต่มีงานมากพอที่จะดำเนินการต่อได้ฉันควรจะเรียนรู้ว่า PRNG ของความเป็นเอกภาพของรัฐอยู่ในขณะนี้และให้รุ่นการพิสูจน์ในอนาคตไกลลงมา การใช้โดยไม่รู้ตัวอาจนำไปสู่ข้อบกพร่องที่น่าผิดหวังอย่างแท้จริง ขอบคุณสำหรับคำแนะนำ.
eternalNoob

2
ฉันสอง @ คำแนะนำของ Philipp หากคุณต้องการ RNG ที่กำหนดขึ้นมาคุณควรลงทุนในการเขียนของคุณเอง (และทดสอบ) คุณจะอยู่ในโลกแห่งความเจ็บปวดหากคุณต้องการใช้ Unity รุ่นใหม่และ RNG เปลี่ยนไปอีกครั้ง มันจะเป็นไปไม่ได้เลยที่คุณจะสร้าง RNG เดียวกันขึ้นมาใหม่หากเกิดเหตุการณ์นี้ขึ้นและเข้ากันได้กับการบันทึก / โลกก่อนหน้า
Stephane Hockenhull

5
ฉันคิดว่าคำแนะนำนั้นควรค่าแก่การเขียนเป็นคำตอบ "ไม่ว่าจะเป็นหรือไม่ได้กำหนดไว้ในตอนนี้อย่าวางใจว่ามันจะเหมือนเดิมเสมอ" (ถ้าคุณสองคนจะเอียงมาก - ฉันไม่ต้องการ ขโมยฟ้าร้องของคุณ) บางคำถามที่ตอบว่าใช่หรือไม่ใช่คำถามจะตอบได้ดีกว่ากับ "ตัวเลือก C: อื่น ๆ ";)
DMGregory

คำตอบ:


8

ในขณะที่ฉันยังไม่มีเวลาทำการทดสอบใด ๆ อย่างกว้างขวางการวิจัยเริ่มต้นแสดงให้เห็นว่าตัวสร้างตัวเลขสุ่มที่ใช้นั้นถูกกำหนดไว้ในแพลตฟอร์มที่แตกต่างกัน การดำเนินงานที่แน่นอนที่ใช้คือความสามัคคี PRNG ดูเพิ่มเติม: เมล็ดพันธุ์ความสามัคคีสุ่มกับฮาร์ดแวร์ที่แตกต่างกัน
ด้วยความเป็นเอกภาพในRandomระดับรัฐที่แน่นอนของ PRNG สามารถบันทึกดู: Unity สุ่ม Sate


7

โทมัสตอบคำถามตามที่ถาม คำถามที่สำคัญยิ่งกว่ามีดังนี้:

เครื่องสร้างตัวเลขสุ่มของ Unity 2017 รับประกันว่าจะส่งมอบหมายเลขเดียวกันในทุกแพลตฟอร์มปัจจุบันและอนาคตที่ได้รับเมล็ดเดียวกันและยังรับประกันว่าจะส่งมอบหมายเลขเดียวกับรุ่น Unity ในอนาคตหรือไม่

มีความเป็นไปได้ค่อนข้างสูงสำหรับกรณีนี้ แต่นั่นไม่เหมือนกับการรับประกัน น่าเสียดายที่คำตอบคือ " ไม่มันไม่ใช่ " การรับประกันจะต้องระบุไว้อย่างชัดเจนในเอกสารของการสุ่มแต่ปัจจุบันไม่มีสิ่งดังกล่าว

โดยส่วนตัวแม้ว่าจะมีการรับประกันเช่นนี้ฉันขอแนะนำไม่ให้ไว้ใจ - แม้ว่าจะมีการรับประกันว่ายังมีโอกาสที่การเปลี่ยนแปลงจะเกิดขึ้นโดยอุบัติเหตุ (ข้อผิดพลาด) หรือเพียงแค่เลิกใช้และถูกลบออกในภายหลัง ในบางจุดคุณอาจต้องการใช้ตัวสร้างนอกกรอบ Unity อีกครั้ง แทนที่จะพึ่งพา Unity เพียงคัดลอกตัวสร้างตัวเลขแบบสุ่มที่คนอื่นเขียน (ให้แน่ใจว่าคุณได้รับอนุญาตให้ใช้รหัส) และเขียนการทดสอบเพื่อตรวจสอบว่าตรงกับความต้องการของคุณสำหรับการสุ่ม


4

ใช้ Unity 2017.2.0f3 UnityEngine.Randomปรากฏขึ้นเพื่อให้ผลลัพธ์เดียวกันในหลายแพลตฟอร์ม ทดสอบบน Windows 10, macOS 10.12 Sierra และ Android 7

ในการทดสอบฉันตัดทอนคลาส SeedFactory ที่ฉันสร้างขึ้น:

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,
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.