Генератор случайных чисел в VBA Excel. Функция Rnd, оператор Randomize, функция рабочего листа RandBetween. Синтаксис, параметры, примеры кода.
Rnd – это функция, которая возвращает значение типа Single, содержащее псевдослучайное число меньшее 1, но большее или равное нулю.
Псевдослучайное число отличается от случайного тем, что оно получено с помощью алгоритма, который, в любом случае, подчиняется какой-либо закономерности. Для решения большинства, а возможно и всех, задач в VBA Excel псевдослучайное число можно считать случайным.
Синтаксис
Rnd[(Число)]
Число – необязательный параметр, определяющий алгоритм вычисления псевдослучайного числа. Зависимость случайного числа от этого параметра:
Число | Возвращаемое значение |
---|---|
Меньше нуля | Одно и то же псевдослучайное число каждый раз, как результат использования параметра Число в качестве начального значения для алгоритма |
Больше нуля | Каждое следующее число в псевдослучайном порядке |
Равно нулю | Самое последнее псевдослучайное число, созданное функцией Rnd |
По умолчанию | Каждое следующее число в псевдослучайном порядке |
Для любого параметра Число создается одна и та же последовательность чисел, так как каждый последующий вызов функции Rnd использует предыдущее значение в качестве начального для следующего псевдослучайного числа в последовательности.
Функция Rnd – это и есть простейший генератор случайных чисел в VBA Excel, возвращающий значения в интервале 0<=Rnd<1.
Чтобы повысить «случайность» псевдослучайных чисел, возвращаемых функцией Rnd, используется оператор Randomize.
Оператор Randomize
Randomize – это оператор, который инициализирует генератор случайных чисел функции Rnd, задавая начальное число для генерации первого псевдослучайного числа.
Синтаксис
Randomize[Число]
Число – необязательный параметр, задающий начальное число для генерации. Если параметр Число опущен, используется значение, возвращенное системным таймером.
При повторном использовании в VBA Excel оператора Randomize с тем же значением аргумента Число предыдущая последовательность не повторяется.
Для повторения предыдущей последовательности случайных чисел необходимо непосредственно перед оператором Randomize с тем же значением аргумента Число вызвать функцию Rnd с отрицательным аргументом.
WorksheetFunction.RandBetween
RandBetween – функция рабочего листа, возвращающая целое случайное число в пределах заданного диапазона значений.
Синтаксис
WorksheetFunction.RandBetween(Arg1, Arg2)
- Arg1 – наименьшее целое число, которое возвращает функция рабочего листа RandBetween (обязательный параметр);
- Arg2 – наибольшее целое число, которое возвращает функция рабочего листа RandBetween (обязательный параметр).
Примеры записи строк с WorksheetFunction.RandBetween в VBA Excel (присвоение случайного числа переменной):
a = WorksheetFunction.RandBetween(—65, —15) a = WorksheetFunction.RandBetween(5, 145) |
Если данную функцию вставить в ячейку рабочего листа, например: =СЛУЧМЕЖДУ(25;55)
, случайное число будет обновляться при каждом пересчете листа.
Примеры с Rnd и Randomize
Пример 1
Запускаем генератор случайных чисел функции Rnd с разными параметрами и выводим результаты на рабочий лист Excel:
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.
Примеры с положительными случайными числами:
‘От 0 (включительно) до 10 10 * Rnd ‘От 6 (включительно) до 7 Rnd + 6 ‘От 5 (включительно) до 10 5 * Rnd + 5 |
Примеры с отрицательными случайными числами:
‘От -10 до 0 (включительно) —10 * Rnd ‘От -10 до 10 (включительно) —20 * Rnd + 10 ‘От -10 до -5 (включительно) —(5 * Rnd + 5) |
Пример заполнения ячеек положительными и отрицательными случайными числами на листе Excel:
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 третьего примера:
Home / VBA / How to Generate Random Numbers in VBA
In VBA, there are different ways that you can use to generate a random number in Excel, and in this post, we will look at all of them one by one.
RND Function
To generate a random number, in VBA, there is a function called RND. This function stands for random and when you use this function in code it returns a random number between 0 to 1. In RND, you don’t need to specify any argument.
Range("A1") = Rnd()
The above code uses it to get a random number in the A1 and it has returned 0.705547521.
But when you use it for an entire range it returns the same random number in the entire range and that makes it void for use to generate random numbers more than once.
Now here it doesn’t make sense to use it, right? But there’s a solution that you can use, FOR NEXT LOOP.
In the above code, you have a loop that loops through 10 cells (one by one) from the selected cell and adds a random number.
Here’s the full code:
Sub vba_random_number()
Dim i As Long
i = 10
For i = 1 To i
ActiveCell.Value = Rnd()
ActiveCell.Offset(1, 0).Select
Next i
End Sub
Random Number Between Two Numbers
If you want to generate a random number between two defined numbers, in that case, you need to write code by using two VBA Functions (RND + INT). The code for this formula would be like below.
Sub vba_random_number()
Dim myRnd As Integer
myRnd = Int(2 + Rnd * (45 - 10 + 1))
Range("A1") = myRnd
End Sub
When you run this macro, RND uses the max number and the min number that you have defined to generate the random number and INT removes the decimal from that.
Using Worksheet Functions in a VBA Code to Generate a Random Number
In VBA, you can access worksheet functions and use them to get a result by specifying the arguments. There are two functions from the worksheet that can help you to get a random number in the result.
- RandBetween
- RandArray
Before you use these functions make sure to understand the arguments that you need to define. Now in the below code, you have RANDBETWEEN which generates a random number between two numbers.
Range("A1") = WorksheetFunction.RandBetween(1000, 2000)
Here the max number is 2000 and the min number is 1000. In the same way, you can use the RANDARRAY which is dynamic arrays function.
Here’s the code.
Range("A1:B10") = WorksheetFunction.RandArray(10, 2, 1000, 2000, True)
If you look at the syntax of the RANDARRAY, you will find that you can enter random numbers in an entire range which is not possible with all the methods that we have discussed above.
Technically there is no such thing as random numbers with no repetition. What you are asking for is actually a random permutation of a set of values, like the ordering of a shuffled deck of cards or lottery ball picks. Random permutation of a range of vlaues can be achieved in Excel VBA succinctly.
Assign your button’s macro to RangeValue():
Public Sub RangeValue()
Dim i As Long
Static n As Long, s As String
Const MIN = 1, MAX = 100, OUT = "A1", DEL = "."
Randomize
Do
i = Rnd * (MAX - MIN) + MIN
If 0 = InStr(s, i & DEL) Then
n = n + 1: s = s & i & DEL
Range(OUT) = i
If n > MAX - MIN Then n = 0: s = ""
Exit Do
End If: DoEvents
Loop
End Sub
That’s it. The above code is all that is required to answer your question as posed.
You can use the Const
line near the top to edit the MIN and MAX range of values that will be spun through randomly. You can also adjust the OUTput cell.
Once all of the values have been output (i.e. 100 button clicks), the code resets and spins through the range again in a new, random order. This continues forever. You can disable multiple spins-through by deleting this line: If n > MAX - MIN Then n = 0: s = ""
How does this work?
The routine maintains a string of previously output values. Each time the procedure is run, it selects a new random value from the range and checks if that value is already logged in the string. If it is it picks a new value and looks again. This continues in a loop until a value not currently logged in the string is randomly selected; that value is logged and output to the cell.
EDIT #1
To address your new question about how to set this up so that it works in more than one cell with different value ranges, assign your button’s macro to ButtonClick():
Public Sub ButtonClick()
Static n1 As Long, s1 As String, n2 As Long, s2 As String
RangeValue 1, 100, "A1", n1, s1
RangeValue 1, 150, "B1", n2, s2
End Sub
Private Sub RangeValue(MIN As Long, MAX As Long, OUT As String, n As Long, s As String)
Dim i As Long
Const DEL = "."
Randomize
Do
i = Rnd * (MAX - MIN) + MIN
If 0 = InStr(s, i & DEL) Then
n = n + 1: s = s & i & DEL
Range(OUT) = i
If n > MAX - MIN Then n = 0: s = ""
Exit Do
End If: DoEvents
Loop
End Sub
EDIT #2
While the above methods are concise, we can be more efficient by permuting the set of values in an array, and by avoiding the selection of values that have already been output. Here is a version that uses Durstenfeld’s implementation of the Fisher–Yates shuffle algorithm:
Public Sub ButtonClick()
Static n As Long, a
Const MIN = 1, MAX = 100, OUT = "A1"
If n = 0 Then a = Evaluate("transpose(row(" & MIN & ":" & MAX & "))"): n = UBound(a)
PermuteArray a, n: Range(OUT) = a(n): n = n - 1
End Sub
Private Sub PermuteArray(a, n As Long)
Dim j As Long, t
Randomize
j = Rnd * (n - 1) + 1
If j <> n Then t = a(j): a(j) = a(n): a(n) = t
End Sub
Fisher–Yates has the advantage that it can be stopped and started as needed and so I am using it on the fly to permute the next value to display on each button click.
And to round this out with a version to use with your scenario of two output cells that use different value ranges:
Public Sub ButtonClick()
Static n1 As Long, n2 As Long, a1, a2
Const MIN1 = 1, MAX1 = 100, OUT1 = "A1"
Const MIN2 = 1, MAX2 = 150, OUT2 = "B1"
If n1 = 0 Then Reset a1, n1, MIN1, MAX1
If n2 = 0 Then Reset a2, n2, MIN2, MAX2
PermuteArray a1, n1: Range(OUT1) = a1(n1): n1 = n1 - 1
PermuteArray a2, n2: Range(OUT2) = a2(n2): n2 = n2 - 1
End Sub
Private Sub PermuteArray(a, n As Long)
Dim j As Long, t
Randomize
j = Rnd * (n - 1) + 1
If j <> n Then t = a(j): a(j) = a(n): a(n) = t
End Sub
Private Sub Reset(a, n As Long, MIN As Long, MAX As Long)
a = Evaluate("transpose(row(" & MIN & ":" & MAX & "))"): n = UBound(a)
End Sub
EDIT #3
I decided to create a version of this that utilizes the «inside-out» variation of Fisher–Yates. This allows us to specify the array of range values and shuffle it at the same time, an elegant and even more efficient enhancement:
Public Sub ButtonClick()
Const MIN = 1, MAX = 100, OUT = "A1"
Static a, n&
If n = 0 Then Reset a, n, MIN, MAX
Range(OUT) = a(n): n = n - 1
End Sub
Private Sub Reset(a, n&, MIN&, MAX&)
Dim i&, j&
Randomize: n = MAX - MIN + 1: ReDim a(1 To n)
For i = 1 To n
j = Rnd * (i - 1) + 1: a(i) = a(j): a(j) = i - 1 + MIN
Next
End Sub
And to expand on your requirement of two different output cells that each use different value ranges, I decided to craft a generalized solution that can be used for an arbitrary number of independent output cells each tied to its own value range:
Public Sub ButtonClick()
Dim MIN, MAX, OUT, i
Static a, n, z
MIN = Array(1, 11, 200): MAX = Array(100, 20, 205): OUT = Array("A1", "B2", "C3")
z = UBound(MIN)
If Not IsArray(n) Then ReDim a(z): ReDim n(z)
For i = 0 To z
If n(i) = 0 Then Reset a(i), n(i), MIN(i), MAX(i)
Range(OUT(i)) = a(i)(n(i)): n(i) = n(i) - 1
Next
End Sub
Private Sub Reset(a, n, MIN, MAX)
Dim i, j
Randomize: n = MAX - MIN + 1: ReDim a(1 To n)
For i = 1 To n
j = Rnd * (i - 1) + 1: a(i) = a(j): a(j) = i - 1 + MIN
Next
End Sub
While the above is setup for three outputs, simply adjust the MIN, MAX, and OUT arrays near the top to suit your needs.
В этом учебном материале вы узнаете, как использовать Excel функцию RND с синтаксисом и примерами.
Описание
Microsoft Excel функция RND возвращает случайное число, которое больше или равно 0 и меньше 1. Вы можете использовать функцию RND в формуле для генерации случайного числа в диапазоне значений.
Функция RND — это встроенная функция Excel, относящаяся к категории математических / тригонометрических функций. Её можно использовать как функцию VBA в Excel.
В качестве функции VBA вы можете использовать эту функцию в коде макроса, который вводится через редактор Microsoft Visual Basic Editor.
Синтаксис
Синтаксис функции RND в Microsoft Excel:
Rnd ( [number] )
Аргументы или параметры
- number
- Необязательно. Он указывает, какое случайное число нужно вернуть (см. Возвращаемое значение ниже).
Возвращаемое значение
Функция RND возвращает случайное число, которое больше или равно 0 и меньше 1. Если предоставленное number
больше 0 или параметр number
опущен, функция RND вернет следующее случайное число в последовательности с использованием ранее сгенерированного случайного числа в качестве начального числа. Если number
меньше 0, функция RND вернет случайное число, используя number
в качестве начального числа. Если number
равно 0, функция RND вернет случайное число, которое было создано последним.
Случайный целочисленный диапазон
Чтобы создать случайное целое число между двумя значениями (диапазоном), вы можете использовать следующую формулу:
Int ((upperbound — lowerbound + 1) * Rnd + lowerbound) |
Где lowerbound — это наименьшее число, а upperbound — наибольшее число, для которого вы хотите создать случайное число.
Int ((25—10+1) * Rnd + 10) |
Приведенная выше формула сгенерирует целое случайное число от 10 до 25.
Применение
- Excel для Office 365, Excel 2019, Excel 2016, Excel 2013, Excel 2011 для Mac, Excel 2010, Excel 2007, Excel 2003, Excel XP, Excel 2000
Тип функции
- Функция VBA
Пример (как функция VBA)
Функцию RND можно использовать только в коде VBA в Microsoft Excel.
Давайте взглянем на некоторые примеры Excel функции RND, чтобы понять, как использовать Excel функцию RND в коде Excel VBA:
Int ((6 — 1 + 1) * Rnd + 1) Результат: случайное число между 1 и 6 Int ((200 — 150 + 1) * Rnd + 150) Результат: случайное число между 150 и 200 Int ((999 — 100 + 1) * Rnd + 100) Результат: случайное число между 100 и 999 |
Например:
Dim LRandomNumber As Integer LRandomNumber = Int ((300 — 200 + 1) * Rnd + 200) |
В этом примере переменная с именем LRandomNumber теперь будет содержать случайное число от 200 до 300.
Добавить функцию Randomize
Если вы обнаружите, что вы не получаете действительно случайное число при вызове функции RND, вы можете использовать функцию RANDOMIZE, чтобы изменить начальное значение для генератора случайных чисел функции RND. Вызов функции RANDOMIZE должен предшествовать вызову функции RND. Например,
Sub Macro1 Dim LRandomNumber As Integer Randomize LRandomNumber = Int ((300 — 200 + 1) * Rnd + 200) End Sub |
В этом примере переменная с именем LRandomNumber теперь будет содержать случайное число от 200 до 300.
Функция Randomize будет гарантировать, что сгенерированное число действительно случайное, путем инициализации генератора случайных чисел начальным значением, которое эквивалентно системному таймеру.
Предупреждение: Если вы не вызываете функцию Randomize перед вызовом функции Rnd, функция Rnd может каждый раз возвращать одно и то же значение случайного числа. И поэтому вы не можете получить действительно случайное число.
Return to VBA Code Examples
This tutorial will demonstrate how to work with random numbers in VBA.
RND Function
The RND Function generates a number that is between 0 and 1. The syntax of the RND Function is:
Rnd([Number]) where:
- Number (Optional) – This is optional and if <0, the function returns the same random number on each call using [Number] as the seed, if =0, the function returns the most recent random number, if >0 the function returns the next generated random number. If blank the default >0, is used.
Sub RndNum()
MsgBox Rnd()
End Sub
Generating a Random Number in VBA
In order to generate a random number between two values, you have to use the RND Function in combination with the INT Function (Integer Function) using the following general formula:
- Int(lowerbound + Rnd * ( upperbound – lowerbound + 1 ) )
So, in order to generate a random number between 2 and 30, you would use the following code:
Sub GeneratingARandomNumber()
Dim randomNumber As Integer
randomNumber = Int(2 + Rnd * (30 - 2 + 1))
Debug.Print randomNumber
End Sub
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
Learn More!
VBA Code Examples Add-in
Easily access all of the code examples found on our site.
Simply navigate to the menu, click, and the code will be inserted directly into your module. .xlam add-in.
(No installation required!)
Free Download