random()
random() возвращает псевдослучайное целое число типа long: random(max) — от 0 до max - 1, random(min, max) — от min до max - 1.
Полная статья
Описание
random() генерирует псевдослучайные числа — то есть числа, которые выглядят случайными, но на самом деле вычисляются по детерминированному алгоритму. При каждом запуске скетча последовательность чисел будет одинаковой, если только не инициализировать генератор разным начальным значением.
Синтаксис
random(max)random(min, max)
Параметры
min: нижняя граница диапазона, включительно (необязательный параметр; если не указан, нижняя граница равна 0)max: верхняя граница диапазона, исключительно
Возвращаемое значение
Функция возвращает псевдослучайное число в диапазоне от min до max - 1 включительно. Тип данных: long.
Например, random(10) вернёт одно из чисел 0–9, а random(5, 10) — одно из чисел 5–9. Значение max никогда не будет получено.
Пример кода
Код ниже демонстрирует оба варианта вызова и выводит результаты в Serial Monitor.
long randNumber;
void setup() {
Serial.begin(9600);
// если аналоговый вход pin 0 не подключён, случайный аналоговый
// шум будет приводить к тому, что randomSeed() будет генерировать
// разные начальные числа при каждом запуске скетча.
// randomSeed() перемешает последовательность случайных чисел.
randomSeed(analogRead(0));
}
void loop() {
// вывести случайное число от 0 до 299
randNumber = random(300);
Serial.println(randNumber);
// вывести случайное число от 10 до 19
randNumber = random(10, 20);
Serial.println(randNumber);
delay(50);
}
Примечания и предупреждения
Инициализация генератора. Поскольку алгоритм детерминированный, без инициализации каждый запуск скетча будет давать одну и ту же последовательность чисел. Чтобы последовательность каждый раз была разной, вызовите randomSeed() с непредсказуемым начальным значением — например, с результатом analogRead() на незадействованном аналоговом выводе. Это стандартный приём: плавающий вывод даёт слегка разные показания при каждом включении.
Воспроизводимые последовательности. Иногда нужно получить одну и ту же «случайную» последовательность повторно — например, для тестирования или генерации одинакового узора. В этом случае вызовите randomSeed() с фиксированным числом перед первым обращением к random(), и последовательность будет одинаковой при каждом запуске.
Ограничение диапазона. Параметр max стоит выбирать с учётом типа переменной, в которой будет храниться результат. Возвращаемое значение имеет тип long, поэтому практический верхний предел — 2 147 483 647. Если задать max больше этого диапазона, компилятор может не выдать понятной ошибки, но результат во время выполнения окажется неожиданным.
Где применяется
- Мигание светодиодов с непредсказуемым интервалом — создаёт эффект живого огня или случайных вспышек.
- Генерация случайных тонов — пищалка или зуммер воспроизводит мелодию из случайных нот.
- Игровые проекты — броски кубика, случайный выбор варианта, перемешивание вопросов.
- Тестирование схем — подача случайных значений на ЦАП или ШИМ-выход для проверки поведения системы.
Практические замечания
- Вызывайте
randomSeed()один раз вsetup(), а не внутриloop()— иначе генератор будет сбрасываться на каждой итерации. - Если аналоговый вывод для
analogRead()подключён к реальному сигналу, он даст плохую случайность. Используйте заведомо незадействованный вывод. - Помните, что
random(max)— это сокращение дляrandom(0, max), нижняя граница всегда включена. - Для криптографических или безопасных задач псевдослучайный генератор Arduino не подходит — используйте его только для некритичных сценариев.
- Если результат кажется «зависшим» или повторяющимся — проверьте, не вызываете ли вы
randomSeed()с константой вместо переменного значения.