Как избежать повторяющихся значений из случайных функций в Unity: руководство по обеспечению уникальных результатов

При разработке игр рандомизация часто используется для создания динамичного и непредсказуемого опыта. Однако существуют сценарии, в которых вы хотите гарантировать, что случайные значения, генерируемые функцией в Unity, уникальны и не повторяются. В этой статье мы рассмотрим несколько методов и приемов кодирования, которые помогут вам сохранить уникальность случайности вашей игры.

Метод 1: использование HashSet
Один из способов предотвращения дублирования значений — использование HashSet. Вот пример фрагмента кода:

HashSet<int> uniqueValues = new HashSet<int>();
int GetUniqueRandomValue()
{
    int value = Random.Range(1, 100);

    while (uniqueValues.Contains(value))
    {
        value = Random.Range(1, 100);
    }

    uniqueValues.Add(value);
    return value;
}

Объяснение: Структура данных HashSet гарантирует сохранение только уникальных значений. Мы генерируем случайное значение и проверяем, существует ли оно уже в HashSet. Если это так, мы регенерируем значение, пока оно не станет уникальным. Получив уникальное значение, мы добавляем его в HashSet, чтобы отслеживать ранее сгенерированные значения.

Метод 2: перетасовка массива
Другой подход — создать массив уникальных значений и перетасовать его. Вот пример:

int[] uniqueValues = Enumerable.Range(1, 100).ToArray();
int currentIndex = uniqueValues.Length - 1;
void ShuffleArray()
{
    while (currentIndex > 0)
    {
        int randomIndex = Random.Range(0, currentIndex);
        int temp = uniqueValues[currentIndex];
        uniqueValues[currentIndex] = uniqueValues[randomIndex];
        uniqueValues[randomIndex] = temp;
        currentIndex--;
    }
}
int GetUniqueRandomValue()
{
    if (currentIndex < 0)
    {
        ShuffleArray();
        currentIndex = uniqueValues.Length - 1;
    }

    int value = uniqueValues[currentIndex];
    currentIndex--;
    return value;
}

Объяснение: В этом методе мы создаем массив, содержащий уникальные значения, с помощью функции Enumerable.Range. Затем мы перемешиваем массив, используя алгоритм Фишера-Йейтса. Каждый раз, когда нам нужно новое случайное значение, мы извлекаем его из массива и уменьшаем текущий индекс. Когда мы исчерпали все значения, мы снова перемешиваем массив, чтобы создать новый набор уникальных значений.

Метод 3: отслеживание сгенерированных значений
Если у вас ограниченный диапазон значений и вы хотите обеспечить уникальность, вы можете отслеживать уже сгенерированные значения. Вот пример:

List<int> generatedValues = new List<int>();
int minValue = 1;
int maxValue = 100;
int GetUniqueRandomValue()
{
    int value = Random.Range(minValue, maxValue + 1);

    while (generatedValues.Contains(value))
    {
        value = Random.Range(minValue, maxValue + 1);
    }

    generatedValues.Add(value);
    return value;
}

Объяснение: В этом методе мы храним список сгенерированных значений. Мы генерируем случайное значение в нужном диапазоне и проверяем, существует ли оно уже в списке. Если это так, мы регенерируем значение, пока оно не станет уникальным. Как только мы получим уникальное значение, мы добавим его в список.

Реализуя эти методы, вы можете гарантировать, что значения, генерируемые случайными функциями в Unity, всегда будут уникальными. Независимо от того, решите ли вы использовать HashSet, перетасовать массив или отслеживать сгенерированные значения, эти методы помогут вам сохранить уникальность и повысить случайность в ваших играх.

Помните, что создание уникального и непредсказуемого опыта имеет решающее значение для увлекательного игрового процесса, и эти методы программирования помогут вам в достижении этой цели.