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

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() с константой вместо переменного значения.

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