Генератор случайных чисел в VBA Excel. Функция Rnd, оператор Randomize, функция рабочего листа RandBetween. Синтаксис, параметры, примеры кода.
Функция Rnd
Псевдослучайное число отличается от случайного тем, что оно получено с помощью алгоритма, который, в любом случае, подчиняется какой-либо закономерности. Для решения большинства, а возможно и всех, задач в VBA Excel псевдослучайное число можно считать случайным.
Синтаксис
Число – необязательный параметр, определяющий алгоритм вычисления псевдослучайного числа. Зависимость случайного числа от этого параметра:
Число | Возвращаемое значение |
---|---|
Меньше нуля | Одно и то же псевдослучайное число каждый раз, как результат использования параметра Число в качестве начального значения для алгоритма |
Больше нуля | Каждое следующее число в псевдослучайном порядке |
Равно нулю | Самое последнее псевдослучайное число, созданное функцией Rnd |
По умолчанию | Каждое следующее число в псевдослучайном порядке |
Для любого параметра Число создается одна и та же последовательность чисел, так как каждый последующий вызов функции Rnd использует предыдущее значение в качестве начального для следующего псевдослучайного числа в последовательности.
Функция Rnd – это и есть простейший генератор случайных чисел в VBA Excel, возвращающий значения в интервале 0<=Rnd<1.
Чтобы повысить «случайность» псевдослучайных чисел, возвращаемых функцией Rnd, используется оператор Randomize.
Оператор Randomize
Синтаксис
Число – необязательный параметр, задающий начальное число для генерации. Если параметр Число опущен, используется значение, возвращенное системным таймером.
При повторном использовании в VBA Excel оператора Randomize с тем же значением аргумента Число предыдущая последовательность не повторяется.
Для повторения предыдущей последовательности случайных чисел необходимо непосредственно перед оператором Randomize с тем же значением аргумента Число вызвать функцию Rnd с отрицательным аргументом.
WorksheetFunction.RandBetween
Синтаксис
- Arg1 – наименьшее целое число, которое возвращает функция рабочего листа RandBetween (обязательный параметр);
- Arg2 – наибольшее целое число, которое возвращает функция рабочего листа RandBetween (обязательный параметр).
Примеры записи строк с WorksheetFunction.RandBetween в VBA Excel (присвоение случайного числа переменной):
1 2 |
a = WorksheetFunction.RandBetween(-65, -15) a = WorksheetFunction.RandBetween(5, 145) |
Если данную функцию вставить в ячейку рабочего листа, например: =СЛУЧМЕЖДУ(25;55)
, случайное число будет обновляться при каждом пересчете листа.
Примеры с Rnd и Randomize
Пример 1
Запускаем генератор случайных чисел функции Rnd с разными параметрами и выводим результаты на рабочий лист Excel:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Sub Primer1() Dim i As Byte Cells(1, 1) = "Rnd(-5)" For i = 2 To 5 Cells(i, 1) = Rnd(-5) Next Cells(1, 2) = "Rnd(3)" For i = 2 To 5 Cells(i, 2) = Rnd(3) Next Cells(1, 3) = "Rnd(0)" For i = 2 To 5 Cells(i, 3) = Rnd(0) Next End Sub |
Получаем следующий результат:
Пример 2
Повторное использование оператора Randomize с тем же значением аргумента Число:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Sub Primer2() Dim i As Byte Cells(1, 1) = "Последовательность 1" Rnd (-1) Randomize 4 For i = 2 To 5 Cells(i, 1) = Rnd Next Cells(1, 2) = "Последовательность 2" Randomize 4 For i = 2 To 5 Cells(i, 2) = Rnd Next Cells(1, 3) = "Последовательность 3" Rnd (-1) Randomize 4 For i = 2 To 5 Cells(i, 3) = Rnd Next End Sub |
Строка кода Rnd (-1)
обеспечивает генерацию последовательности случайных чисел сначала при повторных использованиях оператора Randomize.
Строка кода Randomize 4
перед заполнением второго столбца не влияет на работу функции Rnd, а заполнение последовательности для третьего столбца начинается заново благодаря строке Rnd (-1)
перед оператором Randomize.
Пример 3
Создание генераторов случайных чисел для разных диапазонов. Исходим из того, что функция Rnd генерирует псевдослучайную последовательность из чисел меньше 1, но больше или равным 0.
Примеры с положительными случайными числами:
1 2 3 4 5 6 |
'От 0 (включительно) до 10 10 * Rnd 'От 6 (включительно) до 7 Rnd + 6 'От 5 (включительно) до 10 5 * Rnd + 5 |
Примеры с отрицательными случайными числами:
1 2 3 4 5 6 |
'От -10 до 0 (включительно) -10 * Rnd 'От -10 до 10 (включительно) -20 * Rnd + 10 'От -10 до -5 (включительно) -(5 * Rnd + 5) |
Пример заполнения ячеек положительными и отрицательными случайными числами на листе Excel:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Sub Primer3() Dim i As Byte Cells(1, 1) = "От 1 до 3" For i = 2 To 9 Cells(i, 1) = 2 * Rnd + 1 Next Cells(1, 2) = "От -5 до 5" For i = 2 To 9 Cells(i, 2) = -10 * Rnd + 5 Next Cells(1, 3) = "От -5 до -2" For i = 2 To 9 Cells(i, 3) = -3 * Rnd - 2 Next End Sub |
Результат выполнения кода VBA Excel третьего примера:
А можно ли применить это к датам
Привет, Алекс!
Чтобы использовать в качестве аргумента функции Rnd или оператора Randomize дату, ее необходимо преобразовать в число:
Можно ли написать ГСЧ для кнопки, которая будет возвращать случайное значение выбранное из диапазона, в назначенную ячейку?
Привет, Slovo!
Смотрите, как получить значение случайной ячейки из диапазона, в статье VBA Excel. Выбор случайной ячейки.
точная копия вашего вопроса с готовым решением
https://otvet.mail.ru/question/221629817
Привет. Всё классно.
Можно ли использовать протекание время тоже
Обсуждение закрыто.