UnityEngine.Random ve System.Random arasındaki fark nedir?


24

Bunun arasındaki fark nedir

int randomNumber = UnityEngine.Random.Range(0, 10);

ve bu

// on top of the class
private System.Random _rnd = new System.Random();

// inside a methode of the same class
int randomNumber = _rnd.Next(0, 10);

Her System.Randomzaman sınıfınızın tepesinde, neye UnityEngine.Randomihtiyaç duyulmadığının belirlendiğini biliyorum . Ayrıca System.Randombir stajyer "saat" ile çalıştığını ve "rastgele" sayıların buna dayandığını da biliyorum.

Benim sorum şu ki, UnityEngine.Randomve System.Randomve cadı kodu arasında bir Unity projesi için kullanmak daha iyi bir başka fark var mı?

Yanıtlar:


23

Muhtemelen en önemli fark, Birliğin Random.Rangekullanımının statik olmaktan biraz daha kolay olmasıdır. System.RandomBununla birlikte, C # temel sınıf kütüphanesi size daha fazla kontrol ve izolasyon sunar.

Aynı zamanda farklı başlık altı uygulamaları da kullanmaları mümkündür (her ne kadar benim tahminim Unity'nin Randomsadece sistem açısından uygulanmış olmasına rağmen Random), ancak bu muhtemelen kayda değer bir endişe değildir. Temel olarak her ikisi de muhtemelen aynı tür rasgele sayı üretecidir: bazı tohumlar tarafından tanımlanan bir dizinin yinelenmesine dayanan sahte rastgele bir üreteci).

Kontrol konusu daha önemlidir, çünkü bazı bağlamlarda farklı şeyler için farklı rasgele akışlar kullanmak isteyebilirsiniz. Örneğin, kilit adımlı bir ağ iletişimi ağ bağlamında, oyundaki tüm oyuncular arasında rastgele oynanışı etkileyen olaylar oluşturmak için kullanılan tohumu düzeltmek isteyebilirsiniz, ancak tamamen için kullanılan rasgele sayıların akışını çok fazla önemsemezsiniz. görsel olaylar ve bu akışın daha geleneksel bir şekilde ekilmesine izin verebilir (örneğin oyun başlangıcında sistemin çalışma süresiyle).

Benzer şekilde, çoklu ipliklerde rastgele sayılar üretecekseniz, yarış koşullarını önlemek için her iplik için farklı rastgele nesneler kullanmak isteyebilirsiniz. Oyun mantığınız birçok iş parçacığı üzerinde çalışıyorsa ve örneğin bir oyun yeniden oynatma sisteminiz varsa, bu durum ortaya çıkabilir.

Sonunda, genel olarak birini veya diğerini kullanmak mutlaka daha iyi değil , aksine artılar ve eksiler var. Sayı dizisini gerçekleşebilecek diğer potansiyel rastgele dizilerden yalıtmanız gerektiğinde veya dizinin tohumu üzerinde yerel olarak denetime ihtiyacınız olduğunda, bunun bir örneğini kullanın System.Random. Bir fırlatma kullanımı ya da etkileyici olmayan başka bir senaryo için sadece hızlı ve kirli bir rastgele değere ihtiyacınız varsa, Unity'nin sadeleştirilmiş Randomolması muhtemeldir.


3
Bazı oyunların yaptığı şeylerden biri, oyuncu oyunu kaydettiğinde tohumun değerini korumaktır. Bu şekilde, aynı eylemler aynı sonuçlara yol açar. Bu, tasarruf etmekten kaçınmayı engeller ve daha sonraki bir noktada kaydetmeyi unutursanız, daha önce bulunduğunuz yere geri dönebilirsiniz. Son XCOM bunu yaptı.
GregRos

3
@GregRos İyi bir not, ancak bu makalede anlatıldığı gibi farklı bir tasarruf-gizleme türü ortaya koyabilir - temelde başarılı olana kadar aynı hareketi tekrar denemek yerine, oyuncu çoğu toprağı ilgilendiren harekete kadar farklı hareket dizileri dener. önceden belirlenmiş sırayla başarılı rulolar üzerinde. Tasarruf olan herhangi bir sistemde tasarruf etmek için yollar olduğu ortaya çıktı. Scummers Gonna Scum, bu nedenle bazen XCOM gibi akışa devam etmek mantıklı geliyor .
DMGregory

10

UnityEngine.Random, birkaç kullanım kolaylığı avantajına sahiptir:

  • Statik / global olarak erişilebilir - rastgelelık gerektiren her nesne veya sistem için bir örnek oluşturmanız gerekmez. Komut dosyalarınızın çoğu veya tümü bu kaynağı paylaşabilir.

  • Kolaylık yöntemleri - kendi matematiğinizi yuvarlamaya gerek kalmadan çeşitli faydalı türlerin güzel dağıtılmış rasgele değerlerini almak için Random.Range (), Random.insideUnitSphere, Random.rotationUniform, Random.ColorHSV () öğesini kullanabilirsiniz.

(UnityEngine.Random’un, Mono’nun System.Random uygulamasından farklı çapraz platform tutarlılık garantisi sağlayıp sağlamadığına dair herhangi bir onay bulamadım - bunlar kaputun altında aynı olabilir veya olmayabilir)

Elbette, bunu yapmak için System.Random'u (veya başka bir kütüphaneyi veya kendi PRNG'sini) kullanan kendi sınıfınızı oluşturabilirsiniz, ama bunun güzel kısmı sizin yapmanız gerekmiyor - Birliğin uygulaması size iyi bir temel vermek içindir. kutudan rasgele davranış.

Bununla birlikte, diğer rastgelelik kaynaklarını kullanmak isteyebileceğiniz durumlar vardır:

  • Birden fazla iş parçacığı kullanıyorsanız, çekişmeyi önlemek için her iş parçacığının kendine özgü bir sözde kaynağı olması gerekir (UnityEngine.Random, yalnızca ana iş parçacığında erişilebilir)

  • Bir deterministik sözderandom dizisine (örneğin, seri numaralı bir seviye üreteci için) ihtiyacınız varsa, büyük olasılıkla, başka bir betiğin erişemeyeceği bir sistemin kendi sözderandumluk kaynağına sahip olmasını istersiniz, böylece yürütme sırasındaki farklar buna neden olmaz sayıları atla ve güvendiğin determinizmi kır. Daha fazla bilgi için, Unity blogunda seri numaralı rasgele sayılarla ilgili harika bir yazı var .

  • Güvenlik, kumar veya benzersiz kimlikler oluşturmak için kriptografik olarak güçlü bir rasgeleliğe ihtiyacınız varsa, bu amaçla özel kütüphaneler kullanmalısınız. Ne UnityEngine.Random ne de System.Random yeterli kalite garantisi vermiyor.


Boğmaca, JoshPetrie ve Jon’a özür dilerim - Bunu cep telefonuna yazarken biraz zaman aldım, bu yüzden cevaplarını gönderinceye kadar görmedim. Görünüşe göre hepimiz aynı toprakları kapattık.
DMGregory

Kripto sınıfı rastgelelik için, bkz. RNGCryptoServiceProvider, ancak çok yavaş olduğunu ve Unity'nin soyulmuş tüm .NET platformlarından dışlandığını unutmayın.
McGuireV10

6

UnityEngine.Random statiktir. Bir rasgele sayı üretecinin birden fazla örneğini oluşturmak istiyorsanız, System.Random kullanmak istersiniz.

Birlik Uygulaması için kaynak kodunu aramanın bir yolu yoktur, ancak Microsoft, System.Random kaynağını sağlar .


3
Microsoft'un kaynağının Unity tarafından kullanılan kaynak olmadığı için değil. Bunun yerine Mono kaynağına bakmalısınız.
Arturo Torres Sánchez
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.