Генерация случайных чисел в Microsoft Excel — одна из тех задач, которые на первый взгляд кажутся простыми, но на практике таят массу нюансов. Вы можете нуждаться в рандомных значениях для тестирования формул, моделирования данных, создания игровых механик или даже для случайного распределения участников в конкурсах. Однако не все знают, что в Excel есть целых 5 различных способов получить случайные числа — от элементарных функций до сложных формул с динамическими массивами.
В этой статье мы разберём не только стандартные методы вроде РАНД() или СЛЧИС(), но и покажем, как генерировать уникальные случайные числа в заданном диапазоне, фиксировать их без пересчёта при каждом открытии файла, а также использовать мощь Excel 365 для работы с массивами. Особое внимание уделим типичным ошибкам, которые приводят к дублированию значений или "зависанию" формул.
Если вы когда-нибудь сталкивались с тем, что после пересчёта листа (F9) все ваши "случайные" числа внезапно меняются — эта статья поможет разобраться, почему так происходит и как этого избежать. А для продвинутых пользователей мы подготовили раздел с генерацией случайных чисел с весами (например, когда одно значение должно появляться чаще других) и создание динамических списков без повторений.
1. Базовые функции: RAND и RANDBETWEEN
Начнём с самого простого — встроенных функций РАНД() (или RAND() в английской версии) и СЛНАЧ() (RANDBETWEEN()). Эти инструменты доступны во всех версиях Excel начиная с 2003 года и подходят для большинства задач.
РАНД() генерирует случайное десятичное число от 0 до 1 (не включая 1). Формула не имеет аргументов и обновляется при каждом пересчёте листа. Например:
=РАНД()
Результат может выглядеть как 0,456789123. Чтобы получить число в другом диапазоне, умножьте результат на нужное значение. Например, для диапазона от 0 до 100:
=РАНД()*100
Функция СЛНАЧ() более гибкая — она возвращает целое случайное число между двумя заданными границами. Синтаксис:
=СЛНАЧ(нижняя_граница; верхняя_граница)
Пример для генерации числа от 1 до 10:
=СЛНАЧ(1; 10)
⚠️ Внимание: Обе функции пересчитываются автоматически при любом изменении на листе или при открытии файла. Если вам нужны фиксированные случайные числа, читайте раздел про преобразование формул в значения.
- 🔢 Для десятичных чисел: используйте
РАНД()с умножением/сложением. Например, диапазон от 5 до 15:=РАНД()*10+5. - 🎲 Для целых чисел:
СЛНАЧ()— оптимальный выбор. Поддерживает отрицательные числа:=СЛНАЧ(-10; 10). - ⚡ Быстрый ввод: выделите диапазон ячеек, введите формулу (например,
=СЛНАЧ(1;100)), затем нажмитеCtrl+Enter— формула применится ко всем выделенным ячейкам.
2. Как зафиксировать случайные числа (превратить формулы в значения)
Главная проблема РАНД() и СЛНАЧ() — они обновляются при каждом пересчёте. Если вам нужны постоянные случайные числа (например, для тестовой базы данных), необходимо преобразовать формулы в статические значения.
Сделать это можно двумя способами:
- Копирование → Специальная вставка:
- Выделите ячейки с формулами.
- Нажмите
Ctrl+C(скопировать). - Правой кнопкой мыши выберите
Специальная вставка → Значения(илиCtrl+Alt+V → В).
- Горячие клавиши:
- Выделите ячейки.
- Нажмите
Ctrl+C, затемAlt+E+S+V(для английской версии:Alt+H+V+V).
Важно: после преобразования в значения формулы удаляются безвозвратно. Если потребуется обновить числа, придётся вводить формулы заново.
☑️ Фиксация случайных чисел
⚠️ Внимание: Если вы работаете с Excel Online, горячие клавиши для специальной вставки могут не работать. Используйте контекстное меню правой кнопкой мыши.
Альтернативный метод — использовать макрос VBA для однократной генерации чисел. Например, этот код заполнит выделенный диапазон случайными числами от 1 до 100 и сразу преобразует их в значения:
Sub RandomNumbers()
Dim rng As Range
For Each rng In Selection
rng.Value = Int((100 - 1 + 1) * Rnd + 1)
Next rng
End Sub
Чтобы запустить макрос, нажмите Alt+F8, выберите RandomNumbers и нажмите Выполнить.
3. Генерация уникальных случайных чисел (без повторений)
Частая задача — получить список случайных чисел, где все значения уникальны. Например, для случайного распределения участников по группам или создания лотерейных билетов. Стандартные функции РАНД() и СЛНАЧ() здесь не подходят, так как могут выдавать duplicates.
Решений несколько, в зависимости от версии Excel:
Способ 1: Формула массива (Excel 2019 и старше)
Используем комбинацию ИНДЕКС, ПОИСКПОЗ и РАНД():
=ИНДЕКС($A$1:$A$10; ПОИСКПОЗ(НАИБОЛЬШИЙ(РАНДМАССИВ(СТРОКА($A$1:$A$10));;1); РАНДМАССИВ(СТРОКА($A$1:$A$10));;1); 0))
Где $A$1:$A$10 — диапазон с исходными числами (например, от 1 до 10). Введите формулу как формулу массива (в Excel 365 достаточно нажать Enter, в старых версиях — Ctrl+Shift+Enter).
Способ 2: Функция УНИК() + СЛУЧМЕЖДУ() (Excel 365)
В новых версиях можно использовать динамические массивы:
=УНИК(СЛУЧМЕЖДУ(1;100;10))
Эта формула сгенерирует 10 уникальных чисел от 1 до 100. Если нужно больше чисел, чем возможных уникальных значений (например, 100 чисел от 1 до 50), Excel вернёт ошибку #ЗНАЧ!.
| Метод | Подходит для версий | Макс. уникальных чисел | Динамическое обновление |
|---|---|---|---|
ИНДЕКС+ПОИСКПОЗ |
Excel 2010+ | Ограничено диапазоном | Да |
УНИК+СЛУЧМЕЖДУ |
Excel 365 | До 32767 | Да |
| VBA | Все версии | Неограничено | Нет (фиксированные) |
Почему формула массива может тормозить?
Формулы массива (особенно в старых версиях Excel) пересчитывают весь диапазон при каждом изменении на листе. Если у вас тысячи ячеек с такой формулой, это может значительно замедлить работу файла. Решение: преобразуйте результаты в значения после генерации.
Для полной гарантии уникальности (например, при розыгрыше призов) лучше использовать VBA. Пример макроса для генерации 10 уникальных чисел от 1 до 100:
Sub UniqueRandomNumbers()
Dim arr(), i As Integer, temp As Integer, r As Integer
ReDim arr(1 To 100)
For i = 1 To 100: arr(i) = i: Next i
For i = 1 To 100
r = Int((100 - i + 1) * Rnd + i)
temp = arr(i): arr(i) = arr(r): arr(r) = temp
Next i
Range("A1:A10").Value = Application.Transpose(Array(arr(1), arr(2), arr(3), arr(4), arr(5), arr(6), arr(7), arr(8), arr(9), arr(10)))
End Sub
4. Случайные числа с весами (неравномерное распределение)
Иногда требуется, чтобы одни числа появлялись чаще других. Например, в симуляции продаж некоторые товары должны "выпадать" с вероятностью 70%, а другие — 30%. Для этого используем взвешенное случайное распределение.
Рассмотрим пример: нам нужно сгенерировать числа 1, 2 или 3, где:
- 1 появляется с вероятностью 50%,
- 2 — 30%,
- 3 — 20%.
Алгоритм:
- Создайте вспомогательную таблицу с границами вероятностей:
Число Вероятность Накопительная вероятность 1 50% 0,5 2 30% 0,8 3 20% 1,0 - Используйте формулу с
ИНДЕКСиПОИСКПОЗ:=ИНДЕКС($A$2:$A$4; ПОИСКПОЗ(РАНД(); $C$2:$C$4; 1))где
$A$2:$A$4— столбец с числами, а$C$2:$C$4— с накопительными вероятностями.
Для Excel 365 можно использовать более компактную формулу с ВЫБРАТЬ():
=ВЫБРАТЬ(
РАНД()<0,5; 1;
РАНД()<0,8; 2;
ИСТИНА; 3
)
5. Динамические массивы: генерация списков случайных чисел в Excel 365
Excel 365 и Excel 2021 поддерживают динамические массивы — функции, которые автоматически заполняют несколько ячеек результатами. Для случайных чисел это открывает новые возможности.
Пример 1: Генерация 10 случайных чисел от 1 до 100 в одном столбце:
=СЛУЧМЕЖДУ(1;100;10)
Функция СЛУЧМЕЖДУ с третьим аргументом (10) вернёт массив из 10 чисел. Если ввести её в ячейку A1, результаты автоматически "прольются" вниз по столбцу.
Пример 2: Матрица случайных чисел 5×5:
=РАНДМАССИВ(5;5;1;100;ЦЕЛОЕ())
Аргументы:
5;5— количество строк и столбцов,1;100— диапазон чисел,ЦЕЛОЕ()— опция для целых чисел (без неё будут десятичные).
Пример 3: Уникальные случайные числа в диапазоне:
=СОРТИРОВКАПО(СЛУЧ(); ПОСЛЕДОВ(1;10;;1;))
Эта формула вернёт 10 уникальных чисел от 1 до 10 в случайном порядке. Работает за счёт того, что ПОСЛЕДОВ(1;10) создаёт массив чисел от 1 до 10, а СОРТИРОВКАПО(СЛУЧ(); ...) перемешивает их.
⚠️ Внимание: Динамические массивы могут замедлять работу файла, если используются на больших диапазонах (тысячи ячеек). В таких случаях лучше генерировать числа через VBA или фиксировать результаты как значения.
6. Типичные ошибки и как их избежать
Даже опытные пользователи Excel иногда сталкиваются с проблемами при генерации случайных чисел. Вот самые распространённые ошибки и их решения:
- 🔄 Числа меняются при каждом нажатии
F9:Это нормальное поведение
РАНД()иСЛНАЧ(). Чтобы зафиксировать значения, преобразуйте формулы в статические данные (см. раздел 2). - 🔢 Дублирующиеся числа в
СЛНАЧ():Функция не гарантирует уникальность. Для уникальных значений используйте методы из раздела 3.
- ❌ Ошибка
#ЧИСЛО!вРАНДМАССИВ():Проверьте, что количество запрашиваемых чисел не превышает разницу между верхней и нижней границами. Например,
=РАНДМАССИВ(10;1;1;5)вернёт ошибку, так как невозможно сгенерировать 10 уникальных чисел в диапазоне 1–5. - 🐢 Медленная работа файла:
Слишком много формул массива или
РАНД()на листе? Замените их на статические значения или используйте VBA для однократной генерации.
Ещё одна частая проблема — неправильное округление десятичных чисел. Например, если вам нужны целые числа от 1 до 10, но вы используете =РАНД()*10, вы получите диапазон от 0 до 9,999... Чтобы исправить, добавьте +1 и округлите:
=ОКРУГЛВВЕРХ(РАНД()*10; 0)
Или проще:
=ЦЕЛОЕ(РАНД()*10)+1
Почему РАНД() иногда возвращает 0?
Функция РАНД() генерирует числа от 0 (включительно) до 1 (не включая 1). Теоретически она может вернуть 0, но вероятность этого крайне мала (1 к 10^15). Если вам нужно исключить 0, используйте формулу =РАНД()*(max-min)+min, где min > 0.
7. Продвинутые техники: случайные даты, буквы и цвета
Генерация случайных чисел — только вершина айсберга. В Excel можно создавать случайные даты, текстовые строки и даже цвета ячеек. Разберём несколько примеров.
Случайные даты
Чтобы сгенерировать дату между двумя границами (например, с 01.01.2023 по 31.12.2023):
=СЛНАЧ(ДАТА(2023;1;1); ДАТА(2023;12;31))
Или с использованием РАНД():
=ДАТА(2023;1;1)+РАНД()*(ДАТА(2023;12;31)-ДАТА(2023;1;1))
Случайные буквы или строки
Для генерации случайной буквы английского алфавита:
=СИМВОЛ(СЛНАЧ(65;90)) ' A-Z
=СИМВОЛ(СЛНАЧ(97;122)) ' a-z
Чтобы создать случайную строку длиной 5 символов:
=СЦЕПИТЬ(
СИМВОЛ(СЛНАЧ(65;90));
СИМВОЛ(СЛНАЧ(65;90));
СИМВОЛ(СЛНАЧ(65;90));
СЛНАЧ(0;9);
СЛНАЧ(0;9)
)
Результат может выглядеть как "XK739".
Случайные цвета ячеек
Для изменения цвета фона ячейки случайным образом:
- Выделите ячейку.
- Перейдите в
Условное форматирование → Создать правило → Использовать формулу.... - Введите формулу:
=РАНД()>0,5(цвет будет применяться с вероятностью 50%). - Задайте нужный цвет и нажмите
ОК.
Примечание: Цвета, как и числа, будут пересчитываться при каждом обновлении листа. Чтобы зафиксировать их, скопируйте ячейки и вставьте как Значения, затем вручную назначьте цвета через Формат ячеек.
8. Автоматизация: макросы VBA для генерации случайных чисел
Если вам нужно регулярно генерировать большие массивы случайных чисел или выполнять сложные операции (например, случайное заполнение таблиц с учётом зависимостей), VBA станет вашим лучшим помощником.
Пример 1: Заполнение диапазона уникальными случайными числами:
Sub FillUniqueRandom()
Dim rng As Range, arr(), i As Long, temp As Variant, r As Long
Set rng = Selection
ReDim arr(1 To rng.Rows.Count)
For i = 1 To rng.Rows.Count: arr(i) = i: Next i
For i = 1 To rng.Rows.Count
r = Int((rng.Rows.Count - i + 1) * Rnd + i)
temp = arr(i): arr(i) = arr(r): arr(r) = temp
Next i
rng.Value = Application.Transpose(arr)
End Sub
Выделите диапазон (например, A1:A100) и запустите макрос. Он заполнит его числами от 1 до 100 в случайном порядке без повторений.
Пример 2: Генерация случайных чисел с нормальным распределением (колоколообразная кривая):
Function NormalRandom(mean As Double, stddev As Double) As Double
Dim u1 As Double, u2 As Double, w As Double, mult As Double
Randomize
u1 = Rnd: u2 = Rnd
w = Sqr(-2 Log(u1)) Cos(2 Application.Pi u2)
NormalRandom = w * stddev + mean
End Function
Используйте в ячейке как:
=NormalRandom(10;2)
Где 10 — среднее значение, а 2 — стандартное отклонение.
⚠️ Внимание: Перед использованием макросов убедитесь, что в настройках Excel разрешено выполнение VBA (Файл → Параметры → Центр управления безопасностью → Параметры центра управления безопасностью → Настройки макросов → Включить все макросы).
Для автоматизации рутинных задач можно создать пользовательскую функцию. Например, эта функция генерирует случайную строку заданной длины:
Function RandomString(length As Integer) As String
Dim chars As String, i As Integer, r As Integer
chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
Randomize
For i = 1 To length
r = Int((Len(chars) - 1 + 1) * Rnd + 1)
RandomString = RandomString & Mid(chars, r, 1)
Next i
End Function
Используйте в ячейке:
=RandomString(8)
Результат: "X3K9P2L1".
FAQ: Ответы на частые вопросы
Можно ли в Excel сгенерировать случайные числа без повторений в диапазоне 1–1000?
Да, но стандартными функциями это будет неэффективно. Лучше использовать VBA или Power Query. Пример кода для VBA:
Sub UniqueRandomLarge()
Dim arr(), i As Long, temp As Variant, r As Long
ReDim arr(1 To 1000)
For i = 1 To 1000: arr(i) = i: Next i
For i = 1 To 1000
r = Int((1000 - i + 1) * Rnd + i)
temp = arr(i): arr(i) = arr(r): arr(r) = temp
Next i
Range("A1:A1000").Value = Application.Transpose(arr)
End Sub
Этот макрос заполнит столбец A уникальными числами от 1 до 1000 в случайном порядке.
Почему мои случайные числа в Excel повторяются после сохранения и открытия файла?
Это происходит потому, что функции РАНД() и СЛНАЧ() пересчитываются при каждом открытии файла или изменении на листе. Чтобы избежать повторений:
- Преобразуйте формулы в значения (см. раздел 2).
- Или используйте VBA для однократной генерации чисел.
Если вам нужны разные случайные числа при каждом открытии, но без повторений в текущем сеансе, используйте динамические массивы в Excel 365.
Как сгенерировать случайные числа в Google Таблицах?
В Google Sheets используйте аналогичные функции:
=RAND()— аналогичноРАНД()в Excel.=RANDBETWEEN(1;100)— аналогичноСЛНАЧ(1;100).=ARRAYFORMULA(RANDBETWEEN(1;100;10;1))— генерация массива 10×1.
Чтобы зафиксировать числа, скопируйте их и вставьте как Значения (Ctrl+Shift+V).
Можно ли сделать так, чтобы случайные числа обновлялись по таймеру?
Да, но для этого потребуется VBA. Пример макроса, который обновляет числа каждую секунду:
Sub AutoUpdateRandom()
Application.OnTime Now + TimeValue("00:00:01"), "UpdateRandom"
End Sub
Sub UpdateRandom()
Range("A1:A10").Formula = "=RANDBETWEEN(1,100)"
Call AutoUpdateRandom
End Sub
Sub StartAutoUpdate()
Call AutoUpdateRandom
End Sub
Sub StopAutoUpdate()
On Error Resume Next
Application.OnTime Now + TimeValue("00:00:01"), "UpdateRandom", , False
End Sub
Запустите StartAutoUpdate, чтобы начать обновление, и StopAutoUpdate, чтобы остановить.
Как проверить, что числа действительно случайные?
Для проверки случайности можно использовать:
- Тест хи-квадрат: сравните распределение сгенерированных чисел с равномерным.
- Визуальный анализ: постройте гистограмму (
Вставка → Гистограмма) и проверьте, что столбцы имеют примерно одинаковую высоту. - Корреляция: проверьте, что последовательные числа не зависят друг от друга (используйте функцию
КОРРЕЛ()).
В Excel можно быстро построить гистограмму:
- Выделите диапазон со случайными числами.
- Перейдите на вкладку
Вставка → Гистограмма. - Настройте интервалы (бины) для анализа распределения.