Skip to content

DCFApixels/Quasi_Random

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

32 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Quasi Random Generator

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 на примере генерации точек в двумерном пространстве. ex