Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Repeating random variables in VBA

Tags:

random

vba

How can I use randomize and rnd to get a repeating list of random variables?

By repeating list, I mean if you run a loop to get 10 random numbers, each random number in the list will be unique. In addition, if you were to run this sequence again, you would get the same 10 random numbers as before.

like image 723
sooprise Avatar asked May 21 '10 19:05

sooprise


People also ask

How to generate random numbers in VBA using RND?

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.

How do I repeat a random number sequence in Excel?

Note To repeat sequences of random numbers, call Rnd with a negative argument immediately before using Randomize with a numeric argument. Using Randomize with the same value for number does not repeat the previous sequence. By way of example, if you put this code into Excel, it generates a different number each time you run it:

What is the use of randomize function in VBA?

VBA Randomize is the function which is used for creating random number function which is RND. We all know that VBA RND is used for creating the random numbers which are mainly used for Billing, raising ticket numbers and many for applications are there. Here, VBA Randomize is used for changing the seed value which we feed for RND function.

How do you repeat a random number in Python?

To repeat sequences of random numbers, call Rnd with a negative argument immediately before using Randomize with a numeric argument. Using Randomize with the same value for Number does not repeat the previous sequence. This example uses the Rnd function to generate a random integer value from 1 to 6.


1 Answers

From Microsoft's own mouth:

To repeat sequences of random numbers, call Rnd with a negative argument immediately before using Randomize with a numeric argument.

See here for details.

The whole section:


Remarks

The Rnd function returns a value less than 1 but greater than or equal to zero.

The value of number determines how Rnd generates a random number:

For any given initial seed, the same number sequence is generated because each successive call to the Rnd function uses the previous number as a seed for the next number in the sequence.

Before calling Rnd, use the Randomize statement without an argument to initialize the random-number generator with a seed based on the system timer.

To produce random integers in a given range, use this formula:

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

Here, upperbound is the highest number in the range, and lowerbound is the lowest number in the range.

Note To repeat sequences of random numbers, call Rnd with a negative argument immediately before using Randomize with a numeric argument. Using Randomize with the same value for number does not repeat the previous sequence.


By way of example, if you put this code into Excel, it generates a different number each time you run it:

Sub xx()
    ' x = Rnd(-1) '
    Randomize 10
    MsgBox (Rnd)
End Sub

However, if you uncomment the x = Rnd(-1) line, it generates the same number on each run.

Note that you have to do two things. Call Rnd with a negative argument and call Randomize with a specific argument. Changing either of those things will give you a different seed (and therefore sequence).


Edit:

Re your comment:

By repeating sequence, I mean if you run a loop to get 10 random numbers, each random number in the list will be unique. In addition, if you were to run this sequence again, you would get the same 10 random numbers as before. Does what I'm describing make sense?

You now need one more piece of information. What you're asking for is not random numbers but a shuffling algorithm. I'll refer you to an earlier answer I gave on how to do this here. All you need to do is combine the shuffling algorithm with the seed-setting detailed above and you'll have your repeatable, unique sequence.


And here's some code that shows it in action. Every run of this subroutine returns the sequence 4 1 5 6 2 3 7 10 9 8 so I think that's what you were after, a repetable, "random", unique sequence. If you wanted to be able to generate different sequences (but still in a repeatable manner), you only need to change the value given to Randomize.

Option Explicit
Option Base 1

Sub xx()
    Dim x(10) As Integer
    Dim xc As Integer
    Dim xp As Integer
    Dim i As Integer
    Dim s As String

    For i = 1 To 10
        x(i) = i
    Next
    xc = 10

    i = Rnd(-1)
    Randomize 1

    s = "Values:"
    For i = 1 To 10
        xp = Int(Rnd * xc) + 1
        s = s & " " & CStr(x(xp))
        x(xp) = x(xc)
        xc = xc - 1
    Next i

    MsgBox (s)
End Sub
like image 76
paxdiablo Avatar answered Oct 10 '22 16:10

paxdiablo