RND — генератор случайных чисел в программировании¶
RND — функция генерации псевдослучайных чисел, распространённая в интерпретируемых языках программирования, прежде всего в языке BASIC и его диалектах, а также в современных средах разработки и игровых движках. В классическом виде RND возвращает вещественное число из диапазона [0; 1), то есть значение, равномерно распределённое между нулём и единицей (не включая единицу). Название происходит от англ. random — «случайный».
¶Происхождение и роль в языке BASIC
Функция RND появилась в одной из первых реализаций BASIC — Dartmouth BASIC (1964 год), созданном Джоном Кемени и Томасом Курцем. В языке она была частью стандартного набора математических функций наряду с SIN, COS, LOG и EXP. Позднее RND вошла во все основные диалекты: Microsoft BASIC, GW-BASIC, QuickBASIC, QBasic, Visual Basic, а также в учебные и встроенные интерпретаторы (в частности, в среду Logo и в интерпретатор, поставлявшийся с компьютером ZX Spectrum).
В классическом синтаксисе вызов выглядит как RND(x), где аргумент x определяет поведение генератора:
| Значение x | Поведение |
|---|---|
| x > 0 | возвращается новое псевдослучайное число |
| x = 0 | повторяется последнее сгенерированное число |
| x < 0 | генератор перезапускается с новым начальным значением (seed) |
Для инициализации генератора использовалась команда RANDOMIZE, которая устанавливала начальное значение последовательности — как правило, на основе системных часов, чтобы последовательности различались при каждом запуске программы.
¶Алгоритмы генерации
В разных реализациях RND использовались различные алгоритмы. В ранних версиях Microsoft BASIC применялась линейная congruential generator (LCG) — линейный конгруэнтный генератор, описанный Дональдом Кнутом в «Искусстве программирования». Формула имела вид:
next = (a * current + c) mod m
где a, c и m — подобранные константы. Такой генератор прост, но обладает ограниченным периодом и заметной корреляцией между последовательными значениями в многомерных пространствах.
В более поздних реализациях (например, Visual Basic, современные интерпретаторы) использовались более сложные алгоритмы — Mersenne Twister, генераторы на основе криптографических хеш-функций или комбинированные генераторы, обеспечивающие более длинный период и лучшую статистическую равномерность.
¶Использование в программах
RND применяется для решения задач, требующих случайного выбора: моделирование, генерация данных, игровые механики, статистические эксперименты. Типичный пример — генерация случайного целого числа в заданном диапазоне:
``basic 10 RANDOMIZE TIMER 20 LET N = INT(RND(1) * 6) + 1 30 PRINT "Выпало число: "; N ``
Здесь INT(RND(1) * 6) приводит вещественное значение из [0; 1) к целому от 0 до 5, а прибавление единицы сдвигает диапазон к костям игральных костей — от 1 до 6.
В средах, где RND возвращает значение из [0; 1), для получения равномерного целого числа в диапазоне [a; b] используется формула a + INT(RND * (b - a + 1)).
¶RND в других языках и средах
Хотя RND ассоциируется прежде всего с BASIC, аналогичные функции существуют во многих системах:
- Python —
random.random(),random.randint(); - JavaScript —
Math.random(); - C/C++ —
rand()из стандартной библиотеки; - Pascal —
RandomиRandomize; - Excel — функция
СЛЧИС()(англ.RAND()).
Во всех случаях принцип один и тот же: детерминированная последовательность, имитирующая случайность. Поскольку алгоритм полностью определяется начальным значением, последовательность воспроизводима — это свойство используется в криптографии и моделировании для воспроизводимости экспериментов, но делает стандартный RND непригодным для генерации криптографических ключей.
¶Псевдослучайность и её ограничения
Все реализации RND генерируют не истинно случайные, а псевдослучайные величины. Источником случайности выступает не физический процесс, а математическое преобразование предыдущего значения. Следствия:
- Детерминированность: одна и та же последовательность при одном и том же seed;
- Ограниченный период: после определённого числа значений последовательность повторяется;
- Корреляции: в простых генераторах (LCG) отдельные комбинации значений могут проявляться неравномерно.
Для криптографически стойких задач используются специализированные генераторы (CryptGenRandom, /dev/urandom, датчики шума), не основанные на публичных формулах.
¶RND в российской школьной информатике
В российских учебных программах по информатике функция RND традиционно изучается на примерах языка BASIC и его учебных диалектов. Она входит в задания ЕГЭ по информатике в части, касающейся алгоритмов и программирования, хотя в современных версиях экзамена чаще используются Python и псевдокод. Тем не менее понимание принципа работы RND — детерминированной последовательности, управляемой начальным значением — остаётся базовым для раздела «Алгоритмы и вычислительные процессы».
Источники:
- Кнут Д. «Искусство программирования», том 2 — «Псевдослучайные числа»
- Кемени Дж., Курц Т. «Математика для трёх миллионов» / материалы по истории Dartmouth BASIC
- Microsoft BASIC / GW-BASIC / QBasic — справочная документация
- Стандарт языка Visual Basic — раздел «Генерация случайных чисел»
- Рабочие программы по информатике для средней школы (Россия)
