Перестаньте использовать unityengine.random
Содержание:
- Игра в кости с использованием модуля random в Python
- Зачем нужны функции getstate() и setstate() ?
- Recipes¶
- Функции для получения целых «случайных» чисел – randint() и randrange()
- True random versus pseudo random number generators
- Функции управления генератором
- Official iPhone and Android App
- Как использовать модуль random в Python
- Генерация случайных распределений и псевдослучайных чисел в Python.
- Other Random Generators
- Функции для последовательностей
- Choosing Order
- Но ведь Unity заботится об объеме используемой ОЗУ
- Собственная реализация
- Functions for sequences¶
Игра в кости с использованием модуля random в Python
Далее представлен код простой игры в кости, которая поможет понять принцип работы функций модуля random. В игре два участника и два кубика.
- Участники по очереди бросают кубики, предварительно встряхнув их;
- Алгоритм высчитывает сумму значений кубиков каждого участника и добавляет полученный результат на доску с результатами;
- Участник, у которого в результате большее количество очков, выигрывает.
Код программы для игры в кости Python:
Python
import random
PlayerOne = «Анна»
PlayerTwo = «Алекс»
AnnaScore = 0
AlexScore = 0
# У каждого кубика шесть возможных значений
diceOne =
diceTwo =
def playDiceGame():
«»»Оба участника, Анна и Алекс, бросают кубик, используя метод shuffle»»»
for i in range(5):
#оба кубика встряхиваются 5 раз
random.shuffle(diceOne)
random.shuffle(diceTwo)
firstNumber = random.choice(diceOne) # использование метода choice для выбора случайного значения
SecondNumber = random.choice(diceTwo)
return firstNumber + SecondNumber
print(«Игра в кости использует модуль random\n»)
#Давайте сыграем в кости три раза
for i in range(3):
# определим, кто будет бросать кости первым
AlexTossNumber = random.randint(1, 100) # генерация случайного числа от 1 до 100, включая 100
AnnaTossNumber = random.randrange(1, 101, 1) # генерация случайного числа от 1 до 100, не включая 101
if( AlexTossNumber > AnnaTossNumber):
print(«Алекс выиграл жеребьевку.»)
AlexScore = playDiceGame()
AnnaScore = playDiceGame()
else:
print(«Анна выиграла жеребьевку.»)
AnnaScore = playDiceGame()
AlexScore = playDiceGame()
if(AlexScore > AnnaScore):
print («Алекс выиграл игру в кости. Финальный счет Алекса:», AlexScore, «Финальный счет Анны:», AnnaScore, «\n»)
else:
print(«Анна выиграла игру в кости. Финальный счет Анны:», AnnaScore, «Финальный счет Алекса:», AlexScore, «\n»)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
importrandom PlayerOne=»Анна» PlayerTwo=»Алекс» AnnaScore= AlexScore= diceOne=1,2,3,4,5,6 diceTwo=1,2,3,4,5,6 defplayDiceGame() «»»Оба участника, Анна и Алекс, бросают кубик, используя метод shuffle»»» foriinrange(5) #оба кубика встряхиваются 5 раз random.shuffle(diceOne) random.shuffle(diceTwo) firstNumber=random.choice(diceOne)# использование метода choice для выбора случайного значения SecondNumber=random.choice(diceTwo) returnfirstNumber+SecondNumber print(«Игра в кости использует модуль random\n») foriinrange(3) # определим, кто будет бросать кости первым AlexTossNumber=random.randint(1,100)# генерация случайного числа от 1 до 100, включая 100 AnnaTossNumber=random.randrange(1,101,1)# генерация случайного числа от 1 до 100, не включая 101 if(AlexTossNumber>AnnaTossNumber) print(«Алекс выиграл жеребьевку.») AlexScore=playDiceGame() AnnaScore=playDiceGame() else print(«Анна выиграла жеребьевку.») AnnaScore=playDiceGame() AlexScore=playDiceGame() if(AlexScore>AnnaScore) print(«Алекс выиграл игру в кости. Финальный счет Алекса:»,AlexScore,»Финальный счет Анны:»,AnnaScore,»\n») else print(«Анна выиграла игру в кости. Финальный счет Анны:»,AnnaScore,»Финальный счет Алекса:»,AlexScore,»\n») |
Вывод:
Shell
Игра в кости использует модуль random
Анна выиграла жеребьевку.
Анна выиграла игру в кости. Финальный счет Анны: 5 Финальный счет Алекса: 2
Анна выиграла жеребьевку.
Анна выиграла игру в кости. Финальный счет Анны: 10 Финальный счет Алекса: 2
Алекс выиграл жеребьевку.
Анна выиграла игру в кости. Финальный счет Анны: 10 Финальный счет Алекса: 8
|
1 2 3 4 5 6 7 8 9 10 |
Игравкостииспользуетмодульrandom Аннавыигралаигрувкости.ФинальныйсчетАнны5ФинальныйсчетАлекса2 Аннавыигралаигрувкости.ФинальныйсчетАнны10ФинальныйсчетАлекса2 Аннавыигралаигрувкости.ФинальныйсчетАнны10ФинальныйсчетАлекса8 |
Вот и все. Оставить комментарии можете в секции ниже.
Зачем нужны функции getstate() и setstate() ?
Если вы получили предыдущее состояние и восстановили его, тогда вы сможете оперировать одними и теми же случайными данными раз за разом. Помните, что использовать другую функцию random в данном случае нельзя. Также нельзя изменить значения заданных параметров. Сделав это, вы измените значение состояния .
Для закрепления понимания принципов работы и в генераторе случайных данных Python рассмотрим следующий пример:
Python
import random
number_list =
print(«Первая выборка «, random.sample(number_list,k=5))
# хранит текущее состояние в объекте state
state = random.getstate()
print(«Вторая выборка «, random.sample(number_list,k=5))
# Восстанавливает состояние state, используя setstate
random.setstate(state)
#Теперь будет выведен тот же список второй выборки
print(«Третья выборка «, random.sample(number_list,k=5))
# Восстанавливает текущее состояние state
random.setstate(state)
# Вновь будет выведен тот же список второй выборки
print(«Четвертая выборка «, random.sample(number_list,k=5))
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
importrandom number_list=3,6,9,12,15,18,21,24,27,30 print(«Первая выборка «,random.sample(number_list,k=5)) state=random.getstate() print(«Вторая выборка «,random.sample(number_list,k=5)) random.setstate(state) print(«Третья выборка «,random.sample(number_list,k=5)) random.setstate(state) print(«Четвертая выборка «,random.sample(number_list,k=5)) |
Вывод:
Shell
Первая выборка
Вторая выборка
Третья выборка
Четвертая выборка
|
1 2 3 4 |
Перваявыборка18,15,30,9,6 Втораявыборка27,15,12,9,6 Третьявыборка27,15,12,9,6 Четвертаявыборка27,15,12,9,6 |
Как можно заметить в результате вывода — мы получили одинаковые наборы данных. Это произошло из-за сброса генератора случайных данных.
Recipes¶
The default returns multiples of 2⁻⁵³ in the range
0.0 ≤ x < 1.0. All such numbers are evenly spaced and are exactly
representable as Python floats. However, many other representable
floats in that interval are not possible selections. For example,
isn’t an integer multiple of 2⁻⁵³.
The following recipe takes a different approach. All floats in the
interval are possible selections. The mantissa comes from a uniform
distribution of integers in the range 2⁵² ≤ mantissa < 2⁵³. The
exponent comes from a geometric distribution where exponents smaller
than -53 occur half as often as the next larger exponent.
from random import Random from math import ldexp class FullRandom(Random): def random(self): mantissa = 0x10_0000_0000_0000 | self.getrandbits(52) exponent = -53 x = while not x x = self.getrandbits(32) exponent += x.bit_length() - 32 return ldexp(mantissa, exponent)
All
in the class will use the new method:
>>> fr = FullRandom() >>> fr.random() 0.05954861408025609 >>> fr.expovariate(0.25) 8.87925541791544
The recipe is conceptually equivalent to an algorithm that chooses from
all the multiples of 2⁻¹⁰⁷⁴ in the range 0.0 ≤ x < 1.0. All such
numbers are evenly spaced, but most have to be rounded down to the
nearest representable Python float. (The value 2⁻¹⁰⁷⁴ is the smallest
positive unnormalized float and is equal to .)
See also
Generating Pseudo-random Floating-Point Values a
paper by Allen B. Downey describing ways to generate more
fine-grained floats than normally generated by .
Функции для получения целых «случайных» чисел – randint() и randrange()
Функции и генерируют псевдослучайные целые числа. Первая из них наиболее простая и всегда принимает только два аргумента – пределы целочисленного диапазона, из которого выбирается любое число:
>>> random.randint(0, 10) 6
или (если импортировались отдельные функции):
>>> randint(100, 200) 110
В случае обе границы включаются в диапазон, т. е. на языке математики отрезок описывается как .
Числа могут быть отрицательными:
>>> random.randint(-100, 10) -83 >>> random.randint(-100, -10) -38
Но первое число всегда должно быть меньше или, по-крайней мере, равно второму. То есть a <= b.
Функция сложнее. Она может принимать один аргумент, два или даже три. Если указан только один, то она возвращает случайное число от 0 до указанного аргумента. Причем сам аргумент в диапазон не входит. На языке математики – это [0; a).
>>> random.randrange(10) 4
Или:
>>> randrange(5) 0
Если в передается два аргумента, то она работает аналогично за одним исключением. Верхняя граница не входит в диапазон, т. е. [a; b).
>>> random.randrange(5, 10) 9 >>> random.randrange(1, 2) 1
Здесь результатом второго вызова всегда будет число 1.
Если в передается три аргумента, то первые два – это границы диапазона, как в случае с двумя аргументами, а третий – так называемый шаг. Если, например, функция вызывается как , то «случайное» число будет выбираться из чисел 10, 13, 16, 19:
>>> random.randrange(10, 20, 3) 13 >>> random.randrange(10, 20, 3) 19 >>> random.randrange(10, 20, 3) 10
True random versus pseudo random number generators
A pseudo-random number generator (PRNG) is a finite state machine with an initial value called the seed . Upon each request, a transaction function computes the next internal state and an output function produces the actual number based on the state. A PRNG deterministically produces a periodic sequence of values that depends only on the initial seed given. An example would be a linear congruential generator like PM88. Thus, knowing even a short sequence of generated values it is possible to figure out the seed that was used and thus — know the next value.
A cryptographic pseudo-random number generator (CPRNG) is a PRNG in that it is predictable if the internal state is known. However, assuming the generator was seeded with sufficient entropy and the algorithms have the needed properties, such generators will not quickly reveal significant amounts of their internal state, meaning that you would need a huge amount of output before you can mount a successful attack on them.
A hardware RNG is based on unpredictable physical phenomenon, referred to as «entropy source». Radioactive decay, or more precisely the points in time at which a radioactive source decays is a phenomenon as close to randomness as we know, while decaying particles are easy to detect. Another example is heat variation — some Intel CPUs have a detector for thermal noise in the silicon of the chip that outputs random numbers. Hardware RNGs are, however, often biased and, more importantly, limited in their capacity to generate sufficient entropy in practical spans of time, due to the low variability of the natural phenomenon sampled. Thus, another type of RNG is needed for practical applications: a true random number generator (TRNG). In it cascades of hardware RNG (entropy harvester) are used to periodically reseed a PRNG. When the entropy is sufficient, it behaves as a TRNG.
References
Linux manual page on «urandom»
Alzhrani K., Aljaedi A. (2015) «Windows and Linux Random Number Generation Process: A Comparative Analysis», International Journal of Computer Applications 113:21
Schiller J., Crocker S. (2005) «IETF RFC 4086 — Randomness Requirements for Security»
Goichon F., Lauradoux C., Salagnac G., Vuillemin T. (2012) «A study of entropy transfers in the Linux Random Number Generator», research report 8060
Функции управления генератором
random.seed(a=None, version=2)Инициализирует (запускает) генератор случайных чисел.Если не задан или , используется текущее системное время. Если источники случайности предоставляются операционной системой, они используются вместо системного времени (см. функцию для получения подробной информации).Используется значение , если оно (целое число).
Копировать
При (по умолчанию), объекты , , или преобразуются в и все его биты используются.
При (для воспроизведения случайных последовательностей из более старых версий Python), алгоритм для и вырабатывает более узкий диапазон посева.
random.getstate()Возвращает объект, фиксирующий текущее внутреннее состояние генератора. Этот объект может быть передан в для возобновления состояния.
Копировать
random.setstate(state) должен быть получен из предыдущего вызова. И восстановит внутреннее состояние генератора до такого, которое было получено из вызова .
random.getrandbits(k)Возвращает Python со случайными битами . Этот метод поставляется вместе с генератором MersenneTwister, в то время как другие генераторы могут также предоставлять его как необязательную часть API.
Копировать
При возможности, включает для обработки диапазонов величины.
Official iPhone and Android App
Our official app brings the six most popular RANDOM.ORG randomizers directly on to your iPhone or Android smartphone. We spent a lot of
time getting it just right, so to cover the costs, we have decided
to make some of the randomizers paid, i.e., you need to unlock each for
a small fee – or unlock them all at once and get a solid
discount. Once a randomizer is unlocked, you can use it as much as you
like.
Coin Flipper
The Coin Flipper contains a total of 100 coins from all
over the world, which have been donated by RANDOM.ORG fans
over the years. To flip a coin, simply tap the randomize button. To
see the full coin selection, tap the little settings cog in
the top left corner of the screen. Our favourite coins are
the Ancient Roman ones and the US Challenge Coins. The
history area shows your past coin flips.
FREE
Coin Flipper is unlocked when you download the app. You can
use it as much as you like at no cost.
Download for iPhone | Download for Android
Dice Roller
The Dice Roller can roll up to six 6-sided dice in one go.
Tap the number to select how many you want. The history area
shows your past rolls.
In-App
Purchase Dice Roller is a paid mode that must be
unlocked for a small fee. Once you’ve unlocked it, you can
use it as much as you like.
Download for iPhone | Download for Android
Card Shuffler
The Card Shuffler lets you shuffle decks of cards and turn
the cards over one at a time. You can choose whether to
include jokers or not in your deck by tapping the settings cog
in the top left corner of the screen.
In-App
Purchase Card Shuffler is a paid mode that must be unlocked for a small fee.
Once you’ve unlocked it, you can use it as much
as you like.
Download for iPhone | Download for Android
Lotto Quick Pick
Lotto Quick Pick knows over 150 lotteries from around the
world. No other lottery quick pick (that we know of) uses
atmospheric noise to generate your lottery numbers. To change
your region, tap the little settings cog in the top left
corner. If your lottery isn’t included, you can contact us
and we’ll add it.
In-App
Purchase Lotto Quick Pick is a paid mode that must be
unlocked for a small fee. Once you’ve unlocked it, you can
use it as much as you like.
Download for iPhone | Download for Android
Integer Generator
The Integer Generator can generate true random numbers for
any purpose you like. Simply enter your minimum and maximum
values and tap the randomize button.
In-App
Purchase Integer Generator is a paid mode that must be
unlocked for a small fee. Once you’ve unlocked it, you can
use it as much as you like.
Download for iPhone | Download for Android
List Randomizer
List Randomizer lets you make your own lists of items and
randomize them when you like. Not sure what to have for
dinner or which film to watch? List Randomizer to the rescue.
Particularly popular with teachers who need to quiz students randomly in class.
In-App
Purchase List Randomizer is a paid mode that
must be unlocked for a small fee. Once you’ve unlocked it,
you can use it as much as you like.
Download for iPhone | Download for Android
1998-2021 RANDOM.ORGFollow us: | Terms and ConditionsAbout Us
Как использовать модуль random в Python
Для достижения перечисленных выше задач модуль random будет использовать разнообразные функции. Способы использования данных функций будут описаны в следующих разделах статьи.
В самом начале работы необходимо импортировать модуль random в программу. Только после этого его можно будет полноценно использовать. Оператор для импорта модуля random выглядит следующим образом:
Python
import random
| 1 | importrandom |
Теперь рассмотрим использование самого модуля random на простом примере:
Python
import random
print(«Вывод случайного числа при помощи использования random.random()»)
print(random.random())
|
1 2 3 4 5 |
importrandom print(«Вывод случайного числа при помощи использования random.random()») print(random.random()) |
Вывод:
Shell
Вывод случайного числа при помощи использования random.random()
0.9461613475266107
|
1 2 |
Выводслучайногочислаприпомощииспользованияrandom.random() 0.9461613475266107 |
Как видите, в результате мы получили . У вас, конечно, выйдет другое случайно число.
- является базовой функцией модуля ;
- Почти все функции модуля зависят от базовой функции ;
- возвращает следующее случайное число с плавающей запятой в промежутке .
Перед разбором функций модуля random давайте рассмотрим основные сферы их применения.
Генерация случайных распределений и псевдослучайных чисел в Python.
Модуль реализует генераторы псевдослучайных чисел для различных распределений.
Для целых чисел существует равномерный выбор из диапазона. Для последовательностей существует равномерный выбор случайного элемента, функция для генерации случайной перестановки списка на месте и функция для случайной выборки без замены.
На реальной линии есть функции для вычисления равномерного, нормального (гауссовского), логнормального, отрицательного экспоненциального, гамма и бета распределений. Для генерации распределений углов доступно распределение фон Мизеса.
Почти все функции модуля зависят от базовой функции , которая генерирует случайное число с плавающей точкой в полуоткрытом диапазоне . Python использует Mersenne Twister в качестве генератора ядра. Он генерирует 53-битные значения точности и имеет период . Базовая реализация в C является быстрой и поточно-ориентированной. Mersenne Twister является одним из наиболее тщательно протестированных генераторов случайных чисел из существующих. Однако, будучи полностью детерминированным, он не подходит для всех целей и совершенно не подходит для криптографических целей.
Функции, предоставляемые этим модулем, на самом деле являются связанными методами скрытого экземпляра класса . Вы можете создать свои собственные экземпляры , чтобы получить генераторы, которые не делятся состоянием.
Класс также можно разделить на подклассы, если вы хотите использовать другой базовый генератор вашего собственного устройства: в этом случае переопределите методы , , и . При желании новый генератор может предоставить метод — это позволяет производить выборки в произвольно большом диапазоне.
Модуль также предоставляет класс , который использует системную функцию для генерации случайных чисел из источников, предоставляемых операционной системой.
Предупреждение.
Псевдослучайные генераторы этого модуля не должны использоваться в целях безопасности. В целях безопасности или криптографического использования смотрите «Модуль «.
Замечания по воспроизводимости последовательностей.
Иногда полезно иметь возможность воспроизвести последовательности, заданные генератором псевдослучайных чисел. При повторном использовании начального значения , одна и та же последовательность должна воспроизводиться от запуска к запуску, пока не запущено несколько потоков.
Большинство алгоритмов и функций модуля могут изменяться в разных версиях Python, но два аспекта гарантированно не изменятся:
- Если будет добавлен новый метод, то обязательно будет предложена обратная совместимость.
- Метод генератора будет продолжать создавать ту же последовательность, если совместимому методу будет дано то же самое начальное число .
Other Random Generators
Here you can find all the other Random Generators:
- Random Word Generator
- Random Noun Generator
- Random Synonym Generator
- Random Verb Generator
- Random Name Generator
- Random Adjective Generator
- Random Sentence Generator
- Random Phrase Generator
- Random Paragraph Generator
- Weird Words
- Fake Words
- Random Letter Generator
- Random Number Generator
- Cursive Letters
- Random Password Generator
- Random Bible Verses
- Random Pictures
- Wedding Hashtags Generator
- Random List
- Dinner Ideas Generator
- Breakfast Ideas
- Yes or No Oracle
- Pictionary Generator
- Motivational Quotes
- Random Questions
- Random Facts
- Vocabulary Words
- Writing Prompts
- Coin Flip
- Dice Roll
- Never Have I Ever Questions
- Would You Rather Questions
- Truth or Dare Questions
- Decision Maker
-
Hangman Words
New
Функции для последовательностей
random.choice(seq)Возвращает случайный элемент из непустой последовательности . Если пуст, возникает ошибка .
Копировать
random.choices(population, weights=None, *, cum_weights=None, k=1)Возвращает список элементов размером , выбранных из с заменой. Если пуст, возникает ошибка .
Копировать
Если задана последовательность , выбор производится в соответствии с относительным весом. В качестве альтернативы, если задана последовательность , выбор производится в соответствии с совокупными весами (возможно, вычисляется с использованием ).
Например, относительный вес эквивалентны кумулятивному весу . Внутренне относительные веса преобразуются в кумулятивные перед выбором, поэтому поставка кумулятивного веса экономит время.
Если ни , ни не указаны, выбор производится с равной вероятностью. Если задана последовательность веса, она должна быть такой же, как и последовательность . возникает, если не правильно указан аргумент или .
или могут использовать любой тип чисел, который взаимодействует со значением , возвращаемым функцией (который включает целые числа, числа с плавающей точкой и фракции, но исключает десятичные числа).
random.shuffle(x)Перемешивает последовательность на месте.Необязательный аргумент — функция 0-аргумента, возвращающая случайное значение float в ; по умолчанию это функция .
Копировать
Чтобы перемешать неизменяемую последовательность и вернуть новый перемешанный список, используйте .
Обратите внимание, что даже для небольшого общее количество перестановок может увеличиваться сильнее, чем период большинства генераторов случайных чисел.Это означает, что большинство перестановок длинной последовательности никогда не могут быть выполнены. Например, последовательность длиной 2080 элементов является самой большой, которая может вписываться в период генератора случайных чисел «Мерсин Твистер»
random.sample(population, k)Возвращает список длиной из уникальных элементов, выбранных из последовательности или множества. Используется для случайной выборки без замены.
Копировать
Это новый список, содержащий элементы из последовательности, оставляя исходную последовательности неизменной. Новый список находится в порядке выбора, так что все суб-срезы будут также случайными последовательностями.
Это позволяет победителям розыгрышей (при выборке) делиться на главный приз, второе место и далее.
Участники не должны быть hashable или уникальными. Если последовательность содержит повторы, то каждое вхождение является возможным выбором в выборке.
Что бы выбрать одно число из ряда чисел, используйте объект в качестве аргумента. Это простое решение для выборки из большой последовательности: .
Если размер выборки больше длины последовательности, возникает ошибка .
Choosing Order
If you have a group of people and you need to designate them into a specific order, one way this can be done is to assign each person a number. You can then use the tool to decide the order of each person in the group. For example, if you have 10 people that you need to have randomly lined up, you can assign each a number and then generate a list of random numbers for all ten in the numbers generator. The top number generated would place the person assigned the first spot to that place with the other people in the group moved to the appropriate places from there. This way the numbers generator gives each person a random position.
Но ведь Unity заботится об объеме используемой ОЗУ
Нет, не заботится. Это пример плохого архитектурного решения, когда решили использовать ГПСЧ внутри реализации самого движка и одновременно предоставить доступ из C#. Объект загрузится и на протяжении жизни приложения будет всего один экземпляр в памяти. Это параллельно привносит новое неочевидное поведение и обязывает нас использовать один экземпляр Random на весь проект.
Невозможно заранее предсказать какое именно поведение потребуется пользователям. Но дать им право выбора надо.
Вот еще список потенциальных проблем, с которыми можно столкнуться:
-
Если внутри движка используется то, мы получим неожиданное поведение компонентов, предоставляемые Unity,
-
Скомпилированный в *.dll плагин устанавливает seed. И каждый раз перед вызовом придется проставлять seed. Решить это можно только через декомпиляцию (если финальная библиотека не обфусцирована).
Собственная реализация
Лучшим решением будет сделать что-то простое, что занимает мало памяти и очень быстро работает.
В результате всех исследований и проведенных опытов, самым простым и быстрым вариантом стал — конгруэнтный мультипликативный алгоритм с модулем от числа 2^31.
Я не стал помещать класс в пространство имен, потому что считаю что то, что ниже — проблема архитектора, а не моя.
Генерацию seedá я сделал в нескольких вариациях:
-
Time — использует структуру и предоставляет достаточно надежное значение seedá, но аллоцирует 208 байт. Потому что (сюрприз) неуправляемая структура.
-
Guid — использует структуру и . Guid в отличии от работает медленнее, но аллоцирует всего 16 байт и является управляемой структурой (т.е. размещается на стеке и не копируется в кучу).
-
Crypto — использует и аллоцирует 4 байта. По скорости сравним с Guid, но данный метод не тестировался на разных платформах. Так же, пара простых строчек, может прибавить к размеру билда, если пространство имен раньше не входило в ваш билд.
Тестирование производительности
Кол-во аллокаций неуправляемых объектов проверялся таким образом:
Значения в таблице — среднее время затраченное на заполнение двумерного массива размерностью NxN:
|
Внизу:Кол-во итераций/размер двумерного массива Справа: Тип используемого генератора |
UnityEngine.Random (milliseconds) |
System.Random (milliseconds) |
FastRandom (milliseconds) |
|
25/4096×4096 |
472 |
611 |
223 |
|
1000/1024×1024 |
28 |
43 |
15 |
Тестировалось на ноутбуке ASUS Zephyrus G15 в редакторе. Под разные платформы не компилировалось.
Как установить
Если версия Unity выше чем 2019.3 в файл Packages/manifest.json добавить:
Или просто скачать .unitypackage из раздел Releases
Functions for sequences¶
- (seq)
-
Return a random element from the non-empty sequence seq. If seq is empty,
raises .
- (population, weights=None, *, cum_weights=None, k=1)
-
Return a k sized list of elements chosen from the population with replacement.
If the population is empty, raises .If a weights sequence is specified, selections are made according to the
relative weights. Alternatively, if a cum_weights sequence is given, the
selections are made according to the cumulative weights (perhaps computed
using ). For example, the relative weights
are equivalent to the cumulative weights
. Internally, the relative weights are converted to
cumulative weights before making selections, so supplying the cumulative
weights saves work.If neither weights nor cum_weights are specified, selections are made
with equal probability. If a weights sequence is supplied, it must be
the same length as the population sequence. It is a
to specify both weights and cum_weights.The weights or cum_weights can use any numeric type that interoperates
with the values returned by (that includes
integers, floats, and fractions but excludes decimals). Behavior is
undefined if any weight is negative. A is raised if all
weights are zero.For a given seed, the function with equal weighting
typically produces a different sequence than repeated calls to
. The algorithm used by uses floating
point arithmetic for internal consistency and speed. The algorithm used
by defaults to integer arithmetic with repeated selections
to avoid small biases from round-off error.New in version 3.6.
Changed in version 3.9: Raises a if all weights are zero.
- (x, random)
-
Shuffle the sequence x in place.
The optional argument random is a 0-argument function returning a random
float in [0.0, 1.0); by default, this is the function .To shuffle an immutable sequence and return a new shuffled list, use
instead.Note that even for small , the total number of permutations of x
can quickly grow larger than the period of most random number generators.
This implies that most permutations of a long sequence can never be
generated. For example, a sequence of length 2080 is the largest that
can fit within the period of the Mersenne Twister random number generator.Deprecated since version 3.9, will be removed in version 3.11: The optional parameter random.



