Remkomplekty.ru

IT Новости из мира ПК
3 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Excel vba random

VBA Random Number with Rnd and Randomize

The VBA Tutorials Blog

Introduction to VBA Random Numbers

You can generate random numbers in VBA by using the Rnd function. All random number generators rely on an underlying algorithm, usually fed by what’s called a seed number. You can use the Randomize statement to create a new seed number to ensure your random numbers don’t follow a predictable pattern.

I’ll show you what I mean in this tutorial.

VBA Rnd Function

The VBA Rnd function produces a random number between 0 and 1, excluding exactly 1. Here’s a basic example:

Make powerful macros with our free VBA Developer Kit

There’s a lot to unpack here. To save time and become really good at VBA, make sure you get our free VBA Developer Kit below. It’s full of tips and pre-built macros to make writing VBA easier.

The VBA Rnd function accepts an optional argument, like this: Rnd[Number] .

These are the things you need to keep in mind when passing numbers to the VBA Rnd function:

  • If you pass the VBA Rnd function a number less than 0, it will generate the same random number, using whatever negative value you pass it as the seed number.
  • If you pass it a 0, it will repeat the most recent random number the function gave you. In other words, each time you run it with a 0, it will give you the same number corresponding to the last answer it gave you.
  • If you omit the argument or pass the function a number greater than 0, it will simply give you a new random number — the next random number in the sequence.

I know it sounds odd to say the next random number in the sequence. It implies the the random numbers aren’t really random. Well, they aren’t.

Remember in my introduction when I said random number generators rely on an underlying algorithm fed by seed numbers? The VBA random numbers using the Rnd function are no exception. If you don’t pass the Rnd function an argument, it will produce the exact same random numbers each time you restart Excel and execute it. Don’t believe me? I’ll prove it.

Exit Excel, open it again, and run the following macro 3 times:

When I do it, it produces these results:

Now, exit Excel again, open it again and run the exact same macro 3 more times. You’ll get the same results again:

That doesn’t seem very random, does it? It’s not! Fortunately, there’s a way to make it more random by using the Randomize statement.

VBA Randomize Statement

The Randomize statement is a simple one liner that gives the Rnd function a new seed number based on your computer’s system timer. It’s really simple to use! All you have to do is type Randomize on a line in your macro, like this:

You can pass Randomize an argument, but let’s not worry about that.

Because Randomize creates a new seed number based on your computer’s system time and the system time is always changing, you have eliminated the likelihood of producing random numbers in a predictable pattern.

To prove it, run the same experiment we ran earlier, but this time include the Randomize statement in your macro.

Exit Excel, open it again, and run the following macro 3 times:

I got this result:

Now, exit Excel again, open it again and run the exact same macro 3 more times. This time, I got completely different answers:

The Randomize statement works!

Custom Random Number Generator Functions

Rnd with Randomize

If you don’t want to type Randomize each time you want a random number, you can create your own function, like this:

Copy and paste this into a module and now when you want a random number, you can just call the Random function, like this:

Random Number between 2 Numbers

Sometimes you don’t want a random number between 0 and 1. Actually, a lot of times you don’t want a random number between 0 and 1! That’s why Excel comes with a worksheet function called RANDBETWEEN. You have two choices for finding a random number between two numbers.

If available, you can either call the RANDBETWEEN function by using Application.WorksheetFunction, or you can create your own user-defined function using VBA. I’ll show you how you can do both.

Worksheet Function RANDBETWEEN

The following example creates a random integer between 0 and 10.

VBA User-Defined Function

I prefer to use my own function so I can fully take advantage of the Randomize statement. Here’s a custom function you can copy and paste into your own module to generate a random integer between two numbers

To call this custom VBA random number generator function, you would type something like:

Like the example above, this sample also produces a random integer between 0 and 10.

Closing Thoughts

That’s all I have for this VBA tutorial. Today I showed you how to generate random numbers in VBA, how to eliminate falling into the repeat random numbers trap, and I showed you how to produce random numbers between two integers using Excel VBA.

Now, go off and use these random numbers in whatever program you’re working on! I find myself using them most often in my Monte Carlo calculations.

That’s all for this tutorial. When you’re ready to take your VBA to the next level, subscribe using the form below.

Oh, and if you have a question, post it in our VBA Q&A community.

The best free VBA training on the web
I see people struggling with Excel every day and I want to help. That’s why I’m giving away my 90-days to Master VBA eCourse and my entire personal macro library for free.

Читать еще:  Excel vba высота строки

Over 2 million people use our VBA tutorials each year to help automate their work. Are you ready to reclaim your time, too? Grab our VBA Cheat Sheets and you’ll be writing macros like a professional. With over 180 tips and 135 macro examples, they include everything you need to know to become a great VBA programmer.

VBA Random Numbers

Excel VBA Random Numbers

To generate random numbers in vba we have an inbuilt function called RND. It just takes an argument a number to generate random numbers and this is also an optional parameter. It will create random numbers which are greater than 0 and smaller than 1.

This works exactly the same as the excel function “RAND”. As I told in the worksheet function “RAND”, in VBA too we can generate random numbers which are greater than 0 but less than 1.

Now take a look at the syntax of the “RND” function.

[Number]: We can pass the argument in three ways.

  • If we pass the number as 0, it keeps giving you different random numbers i.e. the next random number in the sequence.

How to Generate Random Numbers using VBA Code?

Example #1

Now we will see the simple example of using the “RND” function. Follow the below steps to write the VBA code on your own.

Step 1: Declare the variable as “Integer” in VBA

Code:

Step 2: Now assign the value to the variable “k” through “RND” function.

Code:

Step 3: Show the value returned by the variable “k” in the message box.

Code:

Now run the excel macro and see what the result is.

Look what has happened.

It is showing the result as 1 where “RND” function can return only numbers which are greater than zero but less than 1.

You must be thinking about what the wrong thing here is.

The wrong thing here is the kind of data type we have assigned to the variable “k”.

If you look back at the variable we have declared we have assigned the data type as Integer. Since we have assigned the variable as Integer, it can only show the whole numbers between -32768 to 32767.

Whenever RND returns the decimal number VBA converts the decimal number to the nearest integer i.e. 1.

So, to make the formula work properly declare the variable as “Double”.

“Double” is the data type which can hold decimal values.

Code:

Now the code and see what the result is.

Click on ok and run one more time and see what the result is.

This time we got a different result. Since “RND” is a volatile function in nature it reproduces different results every time you execute the code.

Example #2 – Get Same Random Number Every Time

As we have seen the previous example “RND” function reproduces the result every time we execute the code. In order to get the same random number, again and again, we need to pass the argument as zero.

Code:

This will produce the same number again and again when we execute the code.

Example #3 – Generate Whole Random Number

We can also generate whole numbers by using other VBA function or other input numbers. For an example look at the below code.

Code:

This code will generate random whole numbers with decimal points every time we execute the code.

If you are looking at the whole numbers without decimal points then we can use below code.

Code:

This will keep generating the whole numbers from 1 to 100.

Recommended Articles

This has been a guide to VBA Random Numbers. Here we learned how to generate vba random numbers using RND function along with some practical examples and downloadable excel template. Below are some useful excel articles related to VBA –

Unlock for Us

A unified Solution for computer problems. Unlocking the best tools, solving the virtual-world problems, news, amazing places and helping through blogging.

Search us!

UnlockforUs Favorites

WinBubble, Customize and tweak your Windows easily

Welcome to the Future of OS — Try Music and Internet Desktop Bin!

Unlock For Us

How to Create a Random Number Generator in Excel using VBA without Repetition

If you Google for this terms , there are lots of ways to generate a random number (compatible with Excel 2007 and below) by creating a macro written in VBA or writing your own function by using Rand() formula that may differ in many ways.

Rand() function in Excel generates a value >= 0 but Insert Button > ActiveX Controls Group > Choose the 4th ActiveX Control (List Box Control)

Click and Hold while moving the cursor until Column F.

Once the List box ActiveX Control is loaded, Right-Click > Properties

change the (Name) to LstNumbers

3. Insert a Command Button: Click the Developers Tab > Insert > ActiveX Controls Group > Choose the 1st ActiveX Control (Command Button Control)

Click and Hold while moving the cursor located below the list box as shown in the picture below:

In the Properties Window: Change the Name of the Button e.g. CmdRandomize

Also, change the Name of the Command Button by modifying the Caption Property e.g. Randomize

4. At Column H, enter any number that will become the Range of Numbers as shown in the picture below:

5. To understand, I wrote a simple program that uses List Box as the Memory and that’s the reason why we need to change the Name Property and input the Range in Column H

Читать еще:  Excel найти дубликаты и выделить цветом

Double-Click the Command Button and Copy-Paste the Code Below:

Dim RndNumber As Integer ‘declare the variable as integer
Dim ii As Integer ‘declare the variable as integer
Dim FndNumber As Boolean ‘Number was Found, YES or NO?

Do

RndNumber = Int((Sheet1.Cells(2, 8) — Sheet1.Cells(1, 8) + 1) * Rnd + Sheet1.Cells(1, 8))

‘ 🙂 Generate the first Number

If LstNumbers.ListCount <> 0 Then ‘If First Number, No need to check

For ii = 1 To LstNumbers.ListCount

‘check to listbox if the number is existing
If RndNumber = LstNumbers.List(ii — 1) Then
FndNumber = True
Exit For ‘Gotcha, Duplicate, EXIT now
Else
FndNumber = False ‘NOT FOUND
End If

If FndNumber = False Then LstNumbers.AddItem RndNumber

‘save the number to listbox if no duplicate found

Loop Until LstNumbers.ListCount = Sheet1.Cells(2, 8) — Sheet1.Cells(1, 8) + 1

‘generate until the last number.

‘ Do loop means read until the TOTAL no. of data to be randomize

DISCLAIMER NOTICE: The code above and the downloadable code can be modified and re-used but I will not be responsible to any problems that may appear.

6. Close the Visual Basic Editor and Start Running the Program by Turning off the Design Mode: In the Developers Tab, Click the Design Mode Button Icon

7. Click the Command Button to Generate numbers depending on the range (COLUMN H).

If you are having some difficulty in creating the example above, Download here (.xlsm Macro-enabled Excel Document)

For the old office 2000-2003 format. .xls file, download here

NOTE: Opening the Excel File

By default, All Macros in Excel is disabled and a security message will appear. To enable: read here first

How I came up with the formula?

References: Microsoft Excel and Visual Basic 6.0 Help Files

Generating Random Value Between two Numbers
Int((Upperbound — Lowerbound + 1) * Rnd + Lowerbound)

MS Excel Help File
(Upperbound — Lowerbound) * Rand + Lowerbound

REAL-WORLD APPLICATIONS

Creating random numbers is very important. The simplest example is the famous MP3 player called WinAmp. When you click the option Shuffle, It will play all your Music Files in a Random way.

Did you experience playing your Playlist in Random but some songs was repeated? 🙂

I hope everybody have learn something in this example.

Excel vba random

19874 просмотра

4 ответа

979 Репутация автора

так что, может быть, это излишне, может быть, это все равно, что спросить, почему большинство людей рождаются с 5 пальцами, короткий ответ в конце всегда: потому что это так, и это просто работает, но я ненавижу этот ответ и, черт возьми, я хочу знать, как Функция Rnd () в VBA работает.

В MSDN для MS Office Excel указано, что RND определяется как:

Rnd[(number)] ‘The optional number argument is a Single or any valid numeric expression.

Это продолжает говорить

«Значение числа определяет, как Rnd генерирует случайное число: для любого заданного начального начального числа генерируется одна и та же последовательность чисел, поскольку каждый последующий вызов функции Rnd использует предыдущее число в качестве начального числа для следующего числа в последовательности».

Чтобы получить случайные целые числа в заданном диапазоне, используйте эту формулу:

Int((upperbound — lowerbound + 1) * Rnd + lowerbound)

так например:
Dim MyValue MyValue = Int((6 * Rnd) + 1) ‘ Generate random value between 1 and 6.

Но как это работает? откуда эти цифры? почему 6 * Rnd + 1 вы получаете случайное число от 1 до 6, но 6 * Rnd + 5 получает от 5 до 10?

Более того, если создателям VBA было так очевидно, какую формулу использовать для успешного сужения этого до определенного диапазона, почему бы просто не использовать функцию RND с необязательными аргументами Ubound и Lbound? Я не могу быть единственным, кто смотрит на эту формулу, что в этом мире?

В конце дня это работает, конечно, хорошо для любых моих потребностей в псевдослучайных числах, и, возможно, я ищу подарочную лошадь во рту, но все же!

Мне приходит в голову, что этот вопрос может быть основан на самой математике. если вы берете маленькое целое число, какие функции вы применяете, чтобы это целое число вписалось в указанный диапазон . так кто-нибудь может объяснить, как работает эта формула?

Ответы (4)

9 плюса

56335 Репутация автора

Вот пошаговое руководство:

  1. Rnd дает случайное десятичное число от 0 до 6 * Rnd дает случайное десятичное число от 0 до Int(6 * Rnd) округлите его , чтобы получить случайное значение от 0 до 5

Очень часто генерируется случайное число между нижней и верхней границей. В Excel есть RANDBETWEEN функция для этого:

Изменить: теперь давайте вписать это в Lbound и Ubound (при условии, что оба целые и Lbound )

Далее мы немного перепишем формулу MSDN:

Из # 3 мы знаем, что Int(((n + 1) * Rnd) дает случайное целое число от 0 до n. Поэтому, когда вы добавляете это случайное число к нижней границе, вы получаете число между нижней границей и верхней границей;

1 плюс

647 Репутация автора

Это может сделать это немного более ясным: Rnd возвращает случайное число в диапазоне от 0 до make_random_old = CLng((up — down + 1) * Rnd + down)

Это крайне неправильно (30 минут отладки моей жизни были ценой, чтобы понять это!) 🙂

Вы можете проверить почему, используя Sub TestMe здесь:

В качестве обходного пути для некоторого случайного в RndBetweem используйте make_random — вторую функцию в коде. Это избавит вас от множества проблем. 🙂

Автор: Vityata Размещён: 15.11.2016 02:04

плюса

481 Репутация автора

У @Code Different уже есть правильный ответ. Это только для людей, которые не получают его с первого взгляда.

  1. Excel генерирует только случайное число от 0 до 1
  2. Умножая случайное число, сгенерированное на шаге 1, на число, x мы можем получить значение между 0 и x
Читать еще:  Вырезать песню из видео онлайн

Int ((upperbound — lowerbound + 1) * Rnd + lowerbound)

генерировать случайное число между верхней и нижней границей

Как VBA ранд генерирует random чисел, используя верхний и нижний предел?

так что, может быть, это излишне, может быть, это похоже на вопрос, почему большинство людей рождаются с 5 пальцами, короткий ответ в конце концов всегда: потому что это так, и это просто работает, но я ненавижу этот ответ и, черт возьми, я хочу знать, как работает функция Rnd() в VBA.

MSDN для Ms Office Excel говорит, что RND определяется как:

Rnd[(number)] ‘The optional number argument is a Single or any valid numeric expression.

Он продолжает говорить:

«Значение числа определяет, как Rnd генерирует число random: для любое заданное начальное семя, одна и та же номерная последовательность генерируется потому, что каждый последующий вызов функции Rnd использует предыдущий номер в качестве семя для следующего числа в последовательности.»

Чтобы получить random целых чисел в заданном диапазоне, используйте эту формулу:

Int((upperbound — lowerbound + 1) * Rnd + lowerbound)

так например:
Dim MyValue MyValue = Int((6 * Rnd) + 1) ‘ Generate random value between 1 and 6.

Но как это работает? откуда берутся эти цифры? почему 6 * Rnd + 1 дает вам число random между 1 и 6, а 6 * Rnd + 5 -число между 5 и 10?

кроме того, если создателям VBA было так очевидно, какую формулу использовать, чтобы успешно сузить этот диапазон до определенного диапазона, почему бы просто не использовать функцию RND с необязательными аргументами Ubound и Lbound? Я не могу быть единственным, кто смотрит на эту формулу, что же это такое?

В конце концов, это работает, конечно, прекрасно для любого из моих псевдо-42-номерных потребностей, и, возможно, я смотрю дареному коню в рот, но все же!

Мне кажется, что этот вопрос может быть основан на самой математике. если вы берете маленькое целое число, какие функции вы применяете, чтобы это целое число поместилось в заданный диапазон.. так может ли кто-нибудь объяснить, как работает эта формула?

4 Ответов

Вот пошаговое руководство:

  1. Rnd дает random десятичное число между 0 и 6 * Rnd дает random десятичное число между 0 и Int(6 * Rnd) округлите его вниз , чтобы получить значение random между 0 и 5

Очень часто генерируется число random между нижней и верхней границей. Excel действительно имеет функцию RANDBETWEEN для этого:

Edit: теперь давайте поместим это в Lbound и Ubound (предполагая, что оба являются целыми числами и Lbound )

Далее мы немного перепишем формулу MSDN:

Из #3, мы знаем, что Int(((n + 1) * Rnd) дает целое число random между 0 и n. поэтому, когда вы добавляете это число random к нижней границе, вы получаете число между нижней и верхней границей;

используя формулу как RndBetween как make_random_old = CLng((up — down + 1) * Rnd + down)

Это крайне неправильно (30 минут отладки моей жизни были ценой, чтобы понять это!) 🙂

Вы можете проверить почему, используя Sub TestMe здесь:

В качестве обходного решения для некоторых random в RndBetweem используйте make_random -вторую функцию в коде. Это избавит вас от множества проблем. 🙂

Это может сделать его немного более ясным: Rnd возвращает число random в диапазоне от 0 до Поделиться Logan Reed 12 июля 2016 в 17:31

@Code Different уже имеет правильный ответ. Это только для тех, кто не понимает этого с первого взгляда

  1. Excel генерирует только число random в диапазоне от 0 до 1
  2. Умножив число random, сгенерированное на шаге 1, на число x , мы можем получить значение между 0 и x

Так как же это происходит

Int ((upperbound — lowerbound + 1) * Rnd + lowerbound)

сгенерируйте число random между верхней и нижней границей

  1. На последнем шаге вы указали число x , к которому было добавлено число random, сгенерированное на шаге 1, было multiplied.Here,to сгенерировать это число x вы делаете upperbound — lowerbound так, что a random_number от 0 до разности двух чисел, т. е. ( upperbound — lowerbound ) будет produced.Now, если вы добавите меньшее число, т. е. lowerbound к random_number , то получится сумма больше, чем lowerbound & меньше, чем upperbound

Похожие вопросы:

Каковы верхний и нижний пределы значений пикселей в OpenCV и как я могу их получить? Единственные ограничения, которые я мог бы выяснить, — это CV_8U Type Mat, где нижний предел для значений.

Я понимаю, что я должен использовать os.urandom() или SystemRandom в Python для ‘secure’ псевдо-random чисел. Но как Python логически генерирует эти random числа? Также есть ли способ создать число.

Я постараюсь, чтобы это было как можно проще и по существу. В принципе, у меня есть веса / вероятности, связанные с определенным диапазоном чисел. Например : 0: 10% 1: 50% 2: 15% 3: 25% Это тогда.

Генератор чисел random генерирует 0 или 1 с равной вероятностью Как создать еще один генератор чисел random, который может генерировать любое целое число от 0 до N

В моей книге по информатике C++ говорится, что для генерации чисел random с нижним пределом (в данном случае 15)и верхним пределом(в данном случае 50) мы должны использовать следующий код. Но когда.

Я хочу напечатать от ячейки A2 до A (конец верхнего предела) с размером шага 0.5. Мой нижний предел может быть 0 или 0.5. Как я могу сделать это в Excel VBA? для E.g. Нижний предел =0 и верхний.

Если я запускаю ./random.sh 10 45 , он будет возвращать только random числа между 10 и 45 . Я могу произвести число random с помощью randomNumber=$((1 + RANDOM % 100)) но теперь, как я могу.

Я пытаюсь получить верхний и нижний предел для моих кнопок разбиения на страницы. Я хочу, чтобы всегда было 9 кнопок. Поэтому изначально с текущим индексом страницы 1 это будет: | 1 | 2 | 3 | 4 | 5.

Я недавно начал изучать язык assembly. Для проекта, над которым я работаю, я должен сделать генератор чисел random, используя линейную конгруэнтность. Предполагается, что я возьму три числа. Верхняя.

Ссылка на основную публикацию
Adblock
detector