Languages: | Русский | 中文 |
---|
Квазислучайные последовательности хорошо подходят когда стоит задача равномерно заполнить пространсво иммитируя случайное заполнение. Реализация основана на новой аддитивной рекурсивной R-последовательности и статье Хабра. R последовательность легко высчитывается, а при подсчете в целых числах дает хорошую производительность.
Данную последовательность я использовал для генерации стартовых позиций, магазинов и прочих точек активности в генераторе карты БольКрафт для Warcraft 3. Так точки активности располагались примерно равномерно по всей карте и при этом их позиции выглядели случайным.
Для установки просто скопируйте содержимое папки src
в проект. Папка src
содержит:
src\QuasiRandom.cs
- базовый, без зависимостей от среды;src\QuasiRandom.unity.cs
- расширение базового для поддержки векторов из Unity;src\QuasiRandom.unity.mathematics.cs
- расширение базового для поддержки векторных типов Unity.Mathematics;
QuasiRandom реализованн в виде структуры размером 4 байта, может генерировать последовательности с равномерным заполнением для 1D, 2D, 3D и 4D пространства.
new QuasiRandom()
- экземпляр с сидом = 0;new QuasiRandom(seed)
- экземпляр с сидом = seed;QuasiRandom.AutoSeed()
- экземпляр с автоматическим сидом;
QuasiRandom.cs
-
bool
[false - true]
NextBool()
NextBool2(out x, out y)
NextBool3(out x, out y, out z)
NextBool4(out x, out y, out z, out w)
; -
int
[int.MinValue <= x <= int.MaxValue]
NextInt()
NextInt2(out x, out y)
NextInt3(out x, out y, out z)
NextInt4(out x, out y, out z, out w)
; -
int
[0 <= x < max]
NextInt(max)
NextInt2(max, out x, out y)
NextInt3(max, out x, out y, out z)
NextInt4(max, out x, out y, out z, out w)
; -
int
[min <= x < max]
NextInt(min, max)
NextInt2(min, max, out x, out y)
NextInt3(min, max, out x, out y, out z)
NextInt4(min, max, out x, out y, out z, out w)
; -
uint
[uint.MinValue <= x <= uint.MaxValue]
NextUInt()
NextUInt2(out x, out y)
NextUInt3(out x, out y, out z)
NextInt4(out x, out y, out z, out w)
; -
uint
[0 <= x < max]
NextUInt(max)
NextUInt2(max, out x, out y)
NextUInt3(max, out x, out y, out z)
NextUInt4(max, out x, out y, out z, out w)
; -
uint
[min <= x < max]
NextUInt(min, max)
NextUInt2(min, max, out x, out y)
NextUInt3(min, max, out x, out y, out z)
NextUInt4(min, max, out x, out y, out z, out w)
; -
long
[long.MinValue <= x <= long.MaxValue]
NextLong()
NextLong2(out x, out y)
NextLong3(out x, out y, out z)
NextLong4(out x, out y, out z, out w)
; -
ulong
[ulong.MinValue <= x <= ulong.MaxValue]
NextULong()
NextULong2(out x, out y)
NextULong3(out x, out y, out z)
NextULong4(out x, out y, out z, out w)
; -
float
[0.0f <= x < 1.0f]
NextFloat()
NextFloat2(out x, out y)
NextFloat3(out x, out y, out z)
NextFloat4(out x, out y, out z, out w)
; -
double
[0.0d <= x < 1.0d]
NextDouble()
NextDouble2(out x, out y)
NextDouble3(out x, out y, out z)
NextDouble4(out x, out y, out z, out w)
; -
VectorX
[0.0f <= x < 1.0f]
NextVector2()
NextVector3()
NextVector4()
;
QuasiRandom.unity.cs
-
VectorX
[0.0f <= x < 1.0f]
NextUnityVector2()
NextUnityVector3()
NextUnityVector4()
; -
VectorXInt
[0.0f <= x < 1.0f]
NextUnityVector2Int()
NextUnityVector3Int()
;
QuasiRandom.unity.mathematics.cs
-
bool
[false - true]
NextBool2()
NextBool3()
NextBool4()
; -
int
[int.MinValue <= x <= int.MaxValue]
NextInt2()
NextInt3()
NextInt4()
; -
int
[0 <= x < max]
NextInt2(max)
NextInt3(max)
NextInt4(max)
; -
int
[min <= x < max]
NextInt2(min, max)
NextInt3(min, max)
NextInt4(min, max)
; -
uint
[uint.MinValue <= x <= uint.MaxValue]
NextUInt2()
NextUInt3()
NextInt4()
; -
uint
[0 <= x < max]
NextUInt2(max)
NextUInt3(max)
NextUInt4(max)
; -
uint
[min <= x < max]
NextUInt2(min, max)
NextUInt3(min, max)
NextUInt4(min, max)
; -
float
[0.0f <= x < 1.0f]
NextFloat2()
NextFloat3()
NextFloat4()
; -
double
[0.0d <= x < 1.0d]
NextDouble2()
NextDouble3()
NextDouble4()
;
GetState()
- Получение состоянияSetState(state)
- Изменение состояния
Переопределены методы Equals
, GethashCode
, ToString
и операторы сравнения
Сравнивается System.Random
и QuasiRandom
на примере генерации точек в двумерном пространстве.