Prawdopodobnie najważniejszą różnicą jest to, że Unity Random.Range
jest nieco łatwiejszy w użyciu, ponieważ jest statyczny. Biblioteka klasy C # System.Random
zapewnia jednak większą kontrolę i izolację.
Możliwe, że używają również różnych implementacji pod maską (chociaż domyślam się, że Unity Random
jest właśnie zaimplementowane pod względem systemu Random
), ale prawdopodobnie nie jest to znaczący problem. Zasadniczo oba są prawdopodobnie tym samym rodzajem generatora liczb losowych: pseudolosowym generatorem opartym na iteracji sekwencji określonej przez niektóre nasiona.
Problem kontroli jest bardziej odpowiedni, ponieważ w niektórych kontekstach możesz chcieć użyć różnych losowych strumieni do różnych rzeczy. Na przykład, w kontekście sieciowej fazy blokowania, możesz chcieć naprawić ziarno używane do generowania losowych zdarzeń mających wpływ na rozgrywkę u wszystkich graczy w grze, ale możesz nie przejmować się tak bardzo strumieniem liczb losowych używanych wyłącznie wydarzenia wizualne i mogą pozwolić na rozsiewanie tego strumienia w bardziej tradycyjny sposób (na przykład z czasem działania systemu przy uruchomieniu gry).
Podobnie, jeśli zamierzasz generować losowe liczby w wielu wątkach, możesz chcieć użyć różnych losowych obiektów dla każdego wątku, aby zapobiec warunkom wyścigu. Może się to zdarzyć, jeśli logika gry przebiega przez wiele wątków, a na przykład masz również system rozgrywki.
W końcu niekoniecznie lepiej jest używać jednego lub drugiego ogólnie, ale są plusy i minusy. Jeśli potrzebujesz odizolować sekwencję liczb od innych potencjalnych losowych sekwencji, które mogą się zdarzyć, lub gdy potrzebujesz zlokalizowanej kontroli nad ziarnem sekwencji, użyj instancji System.Random
. Jeśli potrzebujesz tylko szybkiej i brudnej losowej wartości do użycia na wyrzuceniu lub w innym nie wpływającym na scenariusz scenariuszu, uproszczone Unity Random
jest prawdopodobnie w porządku.
UnityEngine.Random ma kilka zalet łatwości użycia:
Statyczny / globalnie dostępny - nie trzeba tworzyć instancji dla każdego obiektu lub systemu, który wymaga losowości. Większość lub wszystkie skrypty mogą udostępniać ten zasób.
Metody wygody - możesz użyć Random.Range (), Random.insideUnitSphere, Random.rotationUniform, Random.ColorHSV (), aby uzyskać ładnie rozłożone losowe wartości różnych przydatnych typów bez konieczności tworzenia własnej matematyki.
(Nie znalazłem żadnego potwierdzenia, czy UnityEngine.Random zapewnia jakiekolwiek gwarancje spójności między platformami inne niż implementacja Mono System.Random - mogą, ale nie muszą być takie same pod maską)
Możesz oczywiście zbudować własną klasę korzystającą z System.Random (lub innej biblioteki lub własnego PRNG), ale fajną rzeczą jest to, że nie musisz - implementacja Unity ma na celu dać ci dobrą podstawę do losowe zachowanie po wyjęciu z pudełka.
To powiedziawszy, są przypadki, w których będziesz chciał użyć innych źródeł losowości:
Jeśli używasz wielu wątków, każdy wątek powinien mieć własne źródło pseudolosowości, aby uniknąć rywalizacji (UnityEngine.Random jest dostępny tylko w głównym wątku)
Jeśli potrzebujesz deterministycznej sekwencji pseudolosowej (np. Dla generatora poziomu zalążkowego) prawdopodobnie będziesz chciał, aby ten system miał własne źródło pseudolosowości, do którego żaden inny skrypt nie może uzyskać dostępu, aby różnice w kolejności wykonywania nie powodowały pomiń liczby i przełam determinizm, na który liczyłeś. Aby uzyskać więcej informacji, na blogu Unity znajduje się świetny post o rozstawionych losowych liczbach .
jeśli potrzebujesz kryptograficznie silnej przypadkowości dla bezpieczeństwa, hazardu lub generowania unikalnych identyfikatorów, powinieneś w tym celu skorzystać ze specjalistycznych bibliotek. Ani UnityEngine.Random, ani System.Random nie zapewniają wystarczających gwarancji jakości.
źródło
UnityEngine.Random jest statyczny. Jeśli chcesz utworzyć wiele instancji generatora liczb losowych, możesz użyć System.Random.
Nie ma sposobu, aby wyszukać kod źródłowy dla implementacji Unity, jednak Microsoft zapewnia źródło dla System.Random .
źródło