Генерация случайных чисел с использованием Seed в C#(Unity)

В программировании, генерация случайных чисел играет важную роль. Это часто используется для создания разнообразия и случайности в играх, симуляциях и других приложениях. В этой статье мы рассмотрим код на C# (Unity) , который демонстрирует генерацию случайных чисел с использованием фиксированного начального «семени» (seed) .

И так, для начала напишем алгоритм зерна:

int Seed { get { int t = Seed_t.x ^ (Seed_t.x << 11); // Создание нового случайного значения t Seed_t.x = Seed_t.y; // Обновление x Seed_t.y = Seed_t.z; // Обновление y Seed_t.z = Seed_t.w; // Обновление z Seed_t.w = (Seed_t.w ^ (Seed_t.w >> 19)) ^ (t ^ (t >> 8)); // Генерация нового случайного значения w return Seed_t.w; // Возвращение случайного числа } } struct Seed_t { public static int x = -1; // Исходное значение x public static int y = 123; // Исходное значение y public static int z = 456; // Исходное значение z public static int w = 768; // Исходное значение w };

Проверяем в инспекторе что всё работает:

public int t; private void Update() { t = Seed; }

Свойство Seed
Это свойство (property) , которое генерирует случайные числа на основе семени. Здесь происходит магия случайности. Выражение `int t = Seed_t. x ^ (Seed_t. x << 11)` использует битовые операции и сдвиги, чтобы создать новое случайное значение. Семя затем обновляется на основе предыдущих значений, чтобы сохранить случайность.

Seed и Seed_t
В коде определена структура `Seed_t`, которая содержит четыре целочисленных переменных: `x`, `y`, `z`, и `w`. Эти переменные представляют собой «семя» генератора случайных чисел. Начальные значения семени задаются в этой структуре.

Теперь напишем Range:

int Range(int min, int max) { return Seed % (max - min) + min + 1; // Генерация случайного числа в заданном диапазоне [min, max] }

Проверяем в инспекторе что всё работает:

public int t; private void Update() { t = Range(0,10); }

Зачем это нужно?
Сгенерированные случайные числа с помощью фиксированного семени полезны во многих сценариях. Например:
- Тестирование и воспроизводимость: Вы можете использовать фиксированное семя для воспроизведения конкретных сценариев в игре или приложении. Это полезно для тестирования и отладки.
- Генерация контента: Фиксированное семя может быть использовано для генерации случайных уровней, карт, персонажей и другого контента, который должен оставаться постоянным при каждом запуске игры.
- Создание вариабельности: Вы можете использовать генерацию случайных чисел с фиксированным семенем, чтобы добавить разнообразие и случайность в игре, но при этом гарантировать, что каждый игрок увидит одинаковые результаты в рамках одного семени.
Этот код позволяет вам легко создавать случайные числа с фиксированным семенем, что может быть очень полезно в различных игровых и программных сценариях.
Надеюсь, что эта статья помогла вам понять, как работает генерация случайных чисел с фиксированным семенем в представленном коде.

Код полностью, без комментариев:

public class Sample : MonoBehaviour { public int t; private void Update() { t = Range(0,10); } int Range(int min,int max) { return Seed % (max - min) + min + 1; } int Seed { get { int t = Seed_t.x ^ (Seed_t.x << 11); Seed_t.x = Seed_t.y; Seed_t.y = Seed_t.z; Seed_t.z = Seed_t.w; Seed_t.w = (Seed_t.w ^ (Seed_t.w >> 19)) ^ (t ^ (t >> 8)); return Seed_t.w; } } struct Seed_t { public static int x = -1; public static int y = 123; public static int z = 456; public static int w = 768; }; }

P. S: Забыл упомянуть, я написал статью о том как создать собственный генератор чисел.

44
15 комментариев

var rng = new System.Random(100500);
x = rng.Next(1, 100);

Ответить

а там рандом на базе чего берется? timestamp до наносекунд? или как? НЕЛЬЗЯ БЫТЬ УВЕРЕННЫЙ В ИСТИННОМ РАНДОМЕ

Ответить

как увидел семени так аж загенерировал

Ответить

Ничто во вселенной не случайно. Случайность - лишь способ мозга объяснить то, чего он не в силах осознать. Например в компьютерной игре, где все кажется случайным, на самом деле случайность это лишь математическая функция от какого-то далеко не случайного семени. Получается мир, созданный программистом на движке, вполне предсказуем, хоть и мозг не умеет считать так быстро.
Наш мир устроен подобным образом, только математика тут сложнее. Получается если функцию случайности в игре создал программист, то кто создал нашу функцию?

Ответить

Наглядный пример.

Ответить

Комментарий недоступен

Ответить

Надо было мне как-то рандомы генерить. Особо как-то заморачиваться не стал - считал crc от строки сгенерённого uuid. А чё? Решение напрашивается само, плюс выглядит лаконично.

Ответить