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().