Добавить в корзинуПозвонить
Найти в Дзене
KNL Games

Генерация случайных чисел в Arduino: зачем нужна функция randomSeed()?

Если вы когда-либо пробовали создавать игры на Arduino (например, ту же игру «Simon» или «Кости»), вы наверняка сталкивались с функциями random(). Однако при каждом перезапуске контроллера вы могли заметить одну странность: последовательность «случайных» чисел повторяется в точности так же, как и в прошлый раз. Почему так происходит и как заставить Arduino быть по-настоящему непредсказуемой? Ответ кроется в функции randomSeed(). Компьютеры и микроконтроллеры не умеют генерировать истинно случайные числа. Они используют так называемые псевдослучайные числа. Это сложный математический алгоритм, который берет начальное значение (так называемое «зерно» или seed) и на его основе вычисляет следующее число. Если вы не задаете «зерно» вручную, Arduino всегда использует значение по умолчанию (обычно 0 или 1). Поэтому при каждом включении алгоритм начинает вычисления с одной и той же точки — и вы получаете один и тот же «случайный» ряд чисел. Функция randomSeed(seed) задает начальную точку для г
Оглавление

Если вы когда-либо пробовали создавать игры на Arduino (например, ту же игру «Simon» или «Кости»), вы наверняка сталкивались с функциями random(). Однако при каждом перезапуске контроллера вы могли заметить одну странность: последовательность «случайных» чисел повторяется в точности так же, как и в прошлый раз.

Почему так происходит и как заставить Arduino быть по-настоящему непредсказуемой? Ответ кроется в функции randomSeed().

Почему Arduino «предсказуема»?

Компьютеры и микроконтроллеры не умеют генерировать истинно случайные числа. Они используют так называемые псевдослучайные числа. Это сложный математический алгоритм, который берет начальное значение (так называемое «зерно» или seed) и на его основе вычисляет следующее число.

Если вы не задаете «зерно» вручную, Arduino всегда использует значение по умолчанию (обычно 0 или 1). Поэтому при каждом включении алгоритм начинает вычисления с одной и той же точки — и вы получаете один и тот же «случайный» ряд чисел.

Как работает randomSeed()?

Функция randomSeed(seed) задает начальную точку для генератора случайных чисел. Если вы передадите в нее каждый раз разное число, то и последовательность будет разной.

cpp

void setup() {
randomSeed(analogRead(0));
// Используем случайный шум с неподключенного пина
}

Практический метод: «Шум из воздуха»

Самый популярный способ «засеять» генератор случайных чисел в Arduino — использовать аналоговый вход, к которому ничего не подключено.

Когда пин «висит в воздухе», на нем возникают микроскопические электрические наводки и помехи. Напряжение на таком пине постоянно «прыгает» в очень узком диапазоне. Функция analogRead() считывает этот «электрический шум», который практически невозможно повторить дважды.

Пример кода:

cpp

void setup() {
Serial.begin(9600);
// Считываем шум с пина A0 и используем его как основу для генератора
randomSeed(analogRead(0));
}

void
loop() {
// Теперь каждый раз при включении последовательность будет новой
long randNumber = random(1, 10);
Serial.println(randNumber);
delay(1000);
}

Где это пригодится?

  1. Игры (например, Simon): Чтобы каждый раз при запуске игры светодиоды загорались в новом, непредсказуемом порядке.
  2. Генерация уровней: Если вы создаете лабиринты или препятствия, которые должны отличаться при каждой новой сессии.
  3. Имитация поведения: Например, если ваш робот должен случайным образом выбирать время паузы между движениями.

Важные советы

  • Не вызывайте randomSeed() в цикле loop(): Это распространенная ошибка. Если вы будете менять «зерно» слишком часто (например, при каждом вызове random()), вы можете, наоборот, сделать числа менее случайными. Вызывайте эту функцию один раз в setup().
  • Используйте случайный пин: Убедитесь, что пин, который вы передаете в analogRead(), не соединен с землей или питанием, иначе он будет выдавать стабильный 0 или 1023, что сведет всю «случайность» на нет.

Заключение

Функция randomSeed() — это простой, но незаменимый инструмент для любого проекта, где важна непредсказуемость. «Засев» генератора с помощью аналогового шума — это классический прием, который превращает статичную программу в живой, меняющийся проект. Теперь ваша игра Simon или любой другой проект станет по-настоящему уникальным при каждом запуске!