Trình tạo số ngẫu nhiên của Unity 2017 có xác định trên các nền tảng được cung cấp cùng một hạt giống ban đầu không?


17

Là công cụ tạo số ngẫu nhiên tạo ngẫu nhiên xác định trên các nền tảng được cung cấp cùng một hạt giống ban đầu hay tôi nên tự thực hiện?

Tôi biết đã có một số sửa đổi cho trình tạo số ngẫu nhiên gần đây.

Câu trả lời được đánh giá cao, tôi không có thiết bị để thực hiện bất kỳ thử nghiệm nào và tôi chưa tìm thấy tuyên bố trực tiếp về vấn đề này.


11
Câu hỏi hay. Nhưng khi trò chơi của bạn phụ thuộc vào việc tạo thủ tục xác định, bạn có thể muốn lập trình PRNG của riêng mình trong trường hợp Unity từng quyết định thay đổi thuật toán của họ. Tài liệu này không ghi lại thuật toán, vì vậy bạn không nên đảm bảo bất kỳ đảm bảo nào.
Philipp

1
Tôi hiểu quan điểm của bạn, nhưng có đủ công việc để giải quyết, tôi muốn tìm hiểu PRNG của nhà nước hiện tại là gì và cung cấp một phiên bản bằng chứng trong tương lai. Sử dụng nó mà không biết có thể dẫn đến một số lỗi thực sự bực bội. Cảm ơn lời khuyên của bạn.
vĩnh cửuNoob

2
Tôi thứ hai @ Philipp lời khuyên. Nếu bạn cần một RNG xác định, bạn nên đầu tư vào việc tự viết (và thử nghiệm nó). Bạn sẽ ở trong một thế giới bị tổn thương nếu bạn cần sử dụng phiên bản Unity mới và RNG lại thay đổi. Bạn sẽ gần như không thể tạo lại RNG tương tự nếu điều này xảy ra và giữ khả năng tương thích với các thế giới / lưu trước đó.
Stephane Hockenhull

5
Tôi nghĩ rằng lời khuyên đó đáng để viết lên như một câu trả lời, "Cho dù bây giờ nó có hay không mang tính quyết định, đừng tin vào nó luôn giống nhau" (Nếu một trong hai bạn sẽ rất có khuynh hướng - Tôi không muốn ăn cắp sấm sét của bạn). Một số câu hỏi rõ ràng là có hoặc không có câu hỏi nào được trả lời tốt hơn với "tùy chọn C: khác";)
DMGregory

Câu trả lời:


8

Mặc dù tôi không có thời gian để thực hiện bất kỳ thử nghiệm mở rộng nào, nghiên cứu ban đầu cho thấy rằng trình tạo số ngẫu nhiên được sử dụng có tính quyết định trên các nền tảng khác nhau. Việc thực hiện chính xác được sử dụng là: Unity PRNG . Xem thêm: Unity Random Seed trên các phần cứng khác nhau .
Với Randomlớp Unity , trạng thái chính xác của PRNG có thể được lưu, xem: Unity Random Sate .


7

Thomas trả lời câu hỏi như đã hỏi. Câu hỏi quan trọng hơn như sau:

Trình tạo số ngẫu nhiên Unity 2017 có được đảm bảo cung cấp cùng một số trên tất cả các nền tảng hiện tại và tương lai được cung cấp cùng một hạt giống không và nó có được đảm bảo cung cấp các số giống như các bản phát hành trong tương lai của Unity không?

Có khả năng khá cao cho trường hợp này, nhưng điều đó không giống như một sự đảm bảo. Thật không may, câu trả lời là " không, không phải vậy ". Một bảo đảm sẽ cần phải được nêu rõ trong tài liệu của Random , nhưng hiện tại không có điều đó.

Cá nhân, ngay cả khi có một sự bảo đảm như vậy, tôi khuyên bạn không nên tin vào điều đó - ngay cả với một sự bảo đảm vẫn có cơ hội thực hiện bị thay đổi do tai nạn (một lỗi), hoặc đơn giản là bị từ chối và sau đó bị xóa. Tại một số điểm, bạn cũng có thể muốn sử dụng lại trình tạo bên ngoài khung Unity. Thay vì dựa vào Unity, chỉ cần sao chép một trình tạo số ngẫu nhiên mà người khác đã viết (đảm bảo bạn được phép sử dụng mã) và viết một bài kiểm tra để xác minh nó đáp ứng yêu cầu của bạn về tính ngẫu nhiên.


4

Sử dụng Unity 2017.2.0f3, UnityEngine.Random dường như cho kết quả tương tự trên nhiều nền tảng. Đã thử nghiệm trên Windows 10, macOS 10.12 Sierra và Android 7.

Để kiểm tra, tôi đã cắt bớt một lớp SeedFactory tôi đã tạo:

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;
    }

}

Và một MonoBehaviour để chạy thử nghiệm:

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);
    }

}

Và kết quả đều giống nhau:

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,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.