Возможно, наиболее важным отличием является то, что Unity Random.Range
немного проще в использовании, будучи статичным. Библиотека базовых классов C # System.Random
, однако, предлагает вам больше контроля и изоляции.
Возможно, что они также используют различные скрытые реализации (хотя я предполагаю, что Unity Random
просто реализован с точки зрения системы Random
), но это, вероятно, не вызывает особого беспокойства. По существу , они оба вероятно один и тот же тип генератора случайных чисел: генератор псевдослучайной , основанный на переборе последовательность , определенную некоторым семени).
Проблема управления более актуальна, потому что в некоторых случаях вы можете использовать разные случайные потоки для разных целей. Например, в контексте сетевого взаимодействия на уровне блокировки вы можете захотеть исправить начальное число, используемое для генерации случайных событий, влияющих на игровой процесс, для всех игроков в игре, но вы можете не заботиться о потоке случайных чисел, используемых для чисто визуальные события и могут позволить этому потоку быть просеянным более традиционным способом (например, с временем безотказной работы системы при запуске игры).
Точно так же, если вы собираетесь генерировать случайные числа в нескольких потоках, вы можете использовать отдельные случайные объекты для каждого потока, чтобы предотвратить условия гонки. Это может произойти, если ваша игровая логика работает во многих потоках, и у вас, например, также есть система воспроизведения игрового процесса.
В конце концов, не обязательно лучше использовать один или другой в целом, скорее есть плюсы и минусы. Если вам нужно изолировать последовательность чисел от других возможных случайных последовательностей, или когда вам нужен локализованный контроль над начальным числом последовательности, используйте экземпляр System.Random
. Если вам просто нужно быстрое и грязное случайное значение для одноразового использования или какого-либо другого безрезультатного сценария, упрощенный Unity, Random
вероятно, подойдет.
UnityEngine.Random имеет несколько преимуществ в простоте использования:
Статический / глобально доступный - вам не нужно создавать экземпляр для каждого объекта или системы, которая нуждается в случайности. Большинство или все ваши скрипты могут делиться этим ресурсом.
Удобные методы - вы можете использовать Random.Range (), Random.insideUnitSphere, Random.rotationUniform, Random.ColorHSV (), чтобы получить красиво распределенные случайные значения различных полезных типов без необходимости бросать свою собственную математику.
(Я не нашел подтверждения о том, предоставляет ли UnityEngine.Random какие-либо межплатформенные гарантии согласованности, отличные от Mono-реализации System.Random - они могут или не могут быть одинаковыми под капотом)
Конечно, вы можете создать свой собственный класс, который использует System.Random (или другую библиотеку, или ваш собственный PRNG) для этого, но приятная часть в том, что вам это не нужно - реализация Unity предназначена для того, чтобы дать вам хороший базовый уровень для случайное поведение из коробки.
Тем не менее, есть случаи, когда вы захотите использовать другие источники случайности:
Если вы используете несколько потоков, каждый поток должен иметь свой собственный источник псевдослучайности, чтобы избежать конфликтов (UnityEngine.Random доступен только в основном потоке)
Если вам нужна детерминированная псевдослучайная последовательность (например, для генератора с затравочным уровнем), вы, вероятно, захотите, чтобы эта система имела собственный источник псевдослучайности, к которому не может получить доступ ни один другой сценарий, чтобы различия в порядке выполнения не приводили к ее пропустите цифры и сломайте детерминизм, на который вы рассчитывали. Для получения дополнительной информации в блоге Unity есть отличный пост о случайных числах .
если вам нужна криптографически сильная случайность для безопасности, азартных игр или генерации уникальных идентификаторов, вам следует использовать специализированные библиотеки для этой цели. Ни UnityEngine.Random, ни System.Random не предоставляют достаточных гарантий качества.
источник
UnityEngine.Random является статическим. Если вы хотите создать несколько экземпляров генератора случайных чисел, вы можете использовать System.Random.
Невозможно найти исходный код для реализации Unity, однако Microsoft предоставляет источник для System.Random .
источник