GENERATING RANDOM INTEGERS
By Edward F. Moneo
More and more of us are requiring random integers in our QB programs.
Some of us can write the statement for generating a random integer by heart.
However, I'm going to lay down the rules for those of you that don't know them
by heart.
RANDOMIZE TIMER
This statement seeds the random number generator.
This statement must appear at the beginning of your program, at least before
the first RND statement.
Without the RANDOMIZE TIMER, the RND statement(s) of the program will always
generate the exact same set of random numbers. This could be handy for
debugging the program.
The following DIM statements are for proper definition of the variables:
DIM LOWER AS INTEGER 'The FROM or LOWER value of the required random range.
DIM UPPER AS INTEGER 'The TO or UPPER value of the required random range.
DIM RANDINT AS INTEGER 'The generated random integer within the range.
The following is the statement for generating a random integer:
RANDINT = INT ((UPPER - LOWER + 1)*RND + LOWER)
Depending on your QB manual, you may also see the following statement:
RANDINT = INT(RND * (UPPER - LOWER + 1)) + LOWER
Either statement works equally well.
CONSIDERATIONS:
1) Abbreviated statements.
Some programmers will often abbreviate the RND statement as follows.
Example #1: Get random integers from 1 to 10.
RANDINT = INT(RND * (10 - 1 + 1)) + 1
They often abbreviate this to:
RANDINT = INT(RND * 10) + 1
Example #2: Get random integers from 0 to 9.
RANDINT = INT(RND * (9 - 0 + 1)) + 0
They often abbreviate this to:
RANDINT = INT(RND * 10)
These shortcuts can lead to problems, especially when you need to modify
the upper or lower values of the range. The best approach is to place the
complete RND statement, with the LOWER and UPPER parameters, into a
subroutine, SUB or FUNCTION, and always pass both the lower and upper
values of the range.
2) Unique random integers.
Random integers can and will repeat like the throws of the dice.
Some applications need the random integers to always be unique.
Here's a sample bit of code to eliminate duplicate random integers.
RANDOMIZE TIMER
DIM LOWER AS INTEGER
DIM UPPER AS INTEGER
DIM RANDINT AS INTEGER
LOWER = 1
UPPER = 52
DIM DUP (LOWER TO UPPER) 'Setup an array covering all the possibilities.
FOR X = LOWER TO UPPER
DO
RANDINT = INT(RND * (UPPER - LOWER + 1)) + LOWER
WHILE DUP(RANDINT) = 1
DUP(RANDINT) = 1
PRINT RANDINT
NEXT X
The above FOR loop will generate 52 unique random integers.
Within the above DO loop, we get a random integer. We check the DUP array
to see if that value is flagged with a 1, indicating that we had it before.
If we had it before, it's a duplicate, so ignore it and get another random
integer. If it's unique, continue and flag it in the DUP array to indicate
that we just had it, and now process it (in this example, print it).
Hope this all works for you, or at least gives you some ideas.
Regards,
Moneo