Главная chevron_right Функции chevron_right Случайные числа chevron_right randomSeed()

randomSeed()

randomSeed() задаёт начальное значение генератора псевдослучайных чисел: от него зависит, какую последовательность будет выдавать random().

Полная статья

Описание

randomSeed() задаёт стартовое значение для встроенного генератора псевдослучайных чисел Arduino. Сам генератор работает по детерминированному алгоритму: одно и то же начальное значение всегда даёт одну и ту же цепочку чисел. Именно поэтому без явной инициализации random() будет выдавать одинаковую последовательность при каждом запуске скетча.

Чтобы получать разные последовательности при каждом включении платы, нужно передать в randomSeed() что-то трудно предсказуемое. Классический приём — считать шум с незадействованного аналогового вывода через analogRead(): на нём нет ничего подключённого, поэтому показание слегка «плавает» и может служить простым источником начального значения.

Есть и обратная ситуация: если вам нужно воспроизвести одну и ту же последовательность — например, при тестировании или отладке — передайте в randomSeed() фиксированное число. Тогда каждый запуск скетча будет генерировать строго те же значения в том же порядке.

Синтаксис

randomSeed(seed)

Параметры

seed — начальное значение генератора. Тип данных: unsigned long. Значение не должно быть равно нулю — подробнее об этом ниже.

Возвращает

Функция ничего не возвращает.

Пример кода

Скетч считывает аналоговый шум с незадействованного вывода, использует его как начальное значение и затем печатает случайные числа в Serial Monitor.

long randNumber;

void setup() {
  Serial.begin(9600);
  randomSeed(analogRead(0));
}

void loop() {
  randNumber = random(300);
  Serial.println(randNumber);
  delay(50);
}

Практические замечания

  • Если передать seed, равный нулю, seed не сработает — randomSeed(seed) будет проигнорирован и генератор останется в прежнем состоянии. Всегда убеждайтесь, что значение ненулевое.
  • randomSeed() вызывают один раз в setup(), до первого обращения к random().
  • analogRead() на незаземлённом пине — самый простой способ получить «случайное» начальное значение, но качество шума зависит от платы и окружения. Для большинства проектов этого достаточно.
  • Если нужна воспроизводимая последовательность (тестирование, анимация, игра с одинаковым поведением), передайте константу: randomSeed(42) — и последовательность будет одинаковой при каждом запуске.
  • random() и randomSeed() работают с псевдослучайными числами: алгоритм быстрый и удобный, но не подходит для криптографии.

Где применяется

  • Игры и анимации — случайное поведение объектов, эффекты мигания светодиодов, генерация лабиринтов.
  • Тестирование — фиксированный seed позволяет каждый раз воспроизводить одну и ту же входную последовательность и сравнивать результаты.
  • Сенсорные проекты — случайные задержки или паузы между измерениями, чтобы избежать синхронизации нескольких устройств.
  • Звук и музыка — генерация случайных нот или ритмических паттернов на основе random() после инициализации randomSeed().

Полезные материалы