Apakah Unity 2017 random number generator deterministic lintas platform diberi seed awal yang sama?

17

Apakah mesin unity engine angka acak deterministik lintas platform diberi benih awal yang sama atau haruskah saya menerapkan sendiri?

Saya tahu ada beberapa modifikasi pada generator angka acak baru-baru ini.

Jawaban dihargai, saya tidak memiliki perangkat untuk melakukan tes dan saya belum menemukan pernyataan langsung tentang masalah ini.

eternalNoob
sumber
11
Pertanyaan bagus. Tetapi ketika game Anda bergantung pada generasi prosedural yang deterministik, Anda mungkin ingin memprogram PRNG Anda sendiri kalau-kalau Unity memutuskan untuk mengubah algoritma mereka. Dokumentasi tidak mendokumentasikan algoritme, jadi Anda tidak boleh menerima jaminan apa pun.
Philipp
1
Saya mengerti maksud Anda, tetapi ada cukup banyak pekerjaan yang harus diselesaikan, saya lebih suka belajar apa PRNG negara kesatuan saat ini dan memberikan versi bukti masa depan lebih jauh di telepon. Menggunakannya tanpa sepengetahuan dapat menyebabkan beberapa bug yang benar-benar membuat frustrasi. Terima kasih atas saranmu.
eternalNoob
2
Saya kedua @ saran Philipp. Jika Anda membutuhkan RNG deterministik, Anda harus berinvestasi dalam menulis sendiri (dan mengujinya). Anda akan berada di dunia yang terluka jika Anda perlu menggunakan versi Unity baru dan RNG berubah lagi. Hampir tidak mungkin bagi Anda untuk membuat ulang RNG yang sama jika ini terjadi dan menjaga kompatibilitas dengan penyimpanan / dunia sebelumnya.
Stephane Hockenhull
5
Saya pikir saran itu layak ditulis sebagai jawaban, "Apakah itu deterministik atau tidak sekarang, jangan mengandalkan itu selalu sama" (Jika salah satu dari Anda akan cenderung - saya tidak ingin curi guntur kamu). Beberapa pertanyaan ya atau tidak seolah-olah lebih baik dijawab dengan "opsi C: lainnya";)
DMGregory

Jawaban:

8

Sementara saya belum punya waktu untuk melakukan pengujian ekstensif, penelitian awal menunjukkan bahwa generator angka acak yang digunakan adalah deterministik di berbagai platform. Implementasi yang tepat digunakan adalah: Unity PRNG . Lihat juga: Unity Random Seed On Different Hardware .
Dengan Randomkelas Unity , keadaan pasti PRNG dapat disimpan, lihat: Unity Random Sate .

Thomas Mathieson
sumber
7

Thomas menjawab pertanyaan itu ketika ditanya. Pertanyaan yang lebih penting adalah sebagai berikut:

Apakah generator nomor acak Unity 2017 dijamin untuk memberikan angka yang sama di semua platform saat ini dan di masa mendatang diberi benih yang sama, dan apakah itu juga dijamin untuk memberikan nomor yang sama dengan rilis Unity di masa mendatang?

Ada kemungkinan yang agak tinggi untuk hal ini, tetapi itu tidak sama dengan jaminan. Jadi jawabannya, sayangnya, adalah " tidak, tidak ". Jaminan perlu secara eksplisit dinyatakan dalam dokumentasi Acak , tetapi saat ini tidak ada hal seperti itu.

Secara pribadi, bahkan jika ada jaminan seperti itu, saya akan merekomendasikan untuk tidak mempercayainya - bahkan dengan jaminan masih ada peluang implementasi diubah oleh kecelakaan (bug), atau hanya menjadi usang dan kemudian dihapus. Pada titik tertentu Anda juga mungkin ingin menggunakan kembali generator di luar kerangka Unity. Alih-alih mengandalkan Unity, salin saja generator angka acak yang ditulis orang lain (pastikan Anda diizinkan menggunakan kode), dan tulis tes untuk memastikannya memenuhi persyaratan Anda untuk keacakan.

Peter - Unban Robert Harvey
sumber
4

Menggunakan Unity 2017.2.0f3, UnityEngine.Random tampaknya memberikan hasil yang sama di berbagai platform. Diuji pada Windows 10, macOS 10.12 Sierra, dan Android 7.

Untuk menguji, saya memangkas kelas SeedFactory yang saya buat:

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

}

Dan MonoBehaviour untuk menjalankan tes:

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

}

Dan hasilnya semua sama:

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,
Chris McFarland
sumber