Unity 2017 rasgele sayı üreteci, platformlara aynı başlangıç ​​tohumunu verdiğinde deterministik midir?


17

Birlik motorları, aynı ilk tohum verildiğinde platformlar arasında rasgele sayı üreteci belirleyici mi yoksa kendim mi uygulamalıyım?

Son zamanlarda rastgele sayı üretecinde bazı değişiklikler olduğunu biliyorum.

Yanıtlar takdir ediliyor, herhangi bir test yapmak için elimde cihaz yok ve bu konuda henüz doğrudan bir açıklama bulamadım.


11
İyi soru. Ancak oyununuz belirleyici prosedürel üretime bağlı olduğunda, Unity'nin algoritmalarını değiştirmeye karar vermesi durumunda yine de kendi PRNG'nizi programlamak isteyebilirsiniz. Belgeler algoritmayı belgelememektedir, bu nedenle herhangi bir garanti almamalısınız.
Philipp

1
Anladığım kadarıyla anlıyorum, ancak devam etmek için yeterli iş var, şu anda devlet birliğinin PRNG'sinin ne olduğunu öğrenmeyi ve hatta ileride kanıtlanacak bir sürümü sağlamayı tercih ederim. Bilmeden kullanmak bazı gerçekten sinir bozucu hatalara yol açabilir. Tavsiyeniz için teşekkürler.
eternalNoob

2
Philipp'in tavsiyesinde @. Eğer deterministik bir RNG'ye ihtiyacınız varsa, kendiniz yazmak (ve test etmek) için yatırım yapmalısınız. Yeni bir Unity sürümü kullanmanız gerekiyorsa ve RNG tekrar değiştiğinde incinme dünyasında olacaksınız. Bu gerçekleşirse aynı RNG'yi yeniden oluşturmanız ve önceki tasarruflarla / dünyalarla uyumluluğu sürdürmeniz neredeyse imkansız olacaktır.
Stephane Hockenhull

5
Bence tavsiyenin bir cevap olarak yazılmaya değer olacağını düşünüyorum, "Şimdi belirleyici olsun ya da olmasın, her zaman aynı olmaya güvenmeyin" (İkinizden biri çok eğimli olsaydı - istemiyorum gök gürültüsünü çal). Bazı görünüşte evet ya da hayır soruları daha iyi "seçenek C: diğer";) ile cevaplanır
DMGregory

Yanıtlar:



7

Thomas soruyu sordu. Daha önemli soru şudur:

Unity 2017 rasgele sayı üretecinin aynı tohum verildiğinde mevcut ve gelecekteki tüm platformlarda aynı sayıları sağlaması garanti ediliyor mu ve aynı zamanda Unity'nin gelecekteki sürümleriyle aynı sayıları da sunması garanti ediliyor mu?

Bu durum için oldukça yüksek bir olasılık var, ancak bu bir garanti ile aynı değil. Yani cevap maalesef " hayır, değil ". Bir garantinin Rastgele belgelerinde açıkça belirtilmesi gerekir , ancak şu anda böyle bir şey yoktur.

Şahsen, böyle bir garanti olsa bile, güvenmemenizi tavsiye ederim - bir garanti ile bile uygulamanın kazayla (hata) değiştirilme veya sadece kullanımdan kaldırılma ve daha sonra kaldırılma şansı vardır. Bir noktada jeneratörü Unity çerçevesinin dışında tekrar kullanmak isteyebilirsiniz. Unity'ye güvenmek yerine, başka birinin yazdığı rastgele bir sayı üretecini kopyalayın (kodu kullanmanıza izin verildiğinden emin olun) ve rastgele olma gereksinimlerinizi karşıladığını doğrulamak için bir test yazın.


4

Unity 2017.2.0f3 kullanıldığında, UnityEngine.Random'un birden çok platformda aynı sonuçları verdiği görülüyor. Windows 10, macOS 10.12 Sierra ve Android 7'de test edildi.

Test etmek için oluşturduğum bir SeedFactory sınıfını kestim:

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

}

Ve testi gerçekleştirmek için bir 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);
    }

}

Ve sonuçların hepsi aynı:

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,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.