How does HLA's random number generator differ from traditional BASIC's version? I've long based much of my adventure gaming on random numbers, especially during player/monster fighting. Does seeding a number truly make it random, or only quasi-random?

Let's say I have a number between 1 and 35. What guarantee do I have that the computer won't habitually (or accidentally) pick the same range of numbers twice? Or the same individual number twice?

To find out, I wrote a simple QBasic program below:

1 CLEAR
5 CLS : PRINT "Random Number test"
10 FOR x = 1 TO 10
20 RANDOMIZE TIMER
30 i = INT(RND * 35) + 1
40 PRINT i
45 NEXT x

The program was run three separate times, with the following results:

Test #1
Random Number test
27
25
17
31
24
18
27
34
23
22

Test #2
Random Number test
32
29
21
35
29
22
32
4
27
27

Test #3
Random Number test
21
18
10
24
17
11
21
28
16
16

Ah oh...the last two tests repeated the last two sets of numbers not once but TWICE! That's not good!

Now for the same program in HLA:

program random;
#include ("console.hhf");
#include ("stdlib.hhf");
#include ("math.hhf");
static
i:int32:=0;
x:int32:=0;
begin random;
console.cls();
stdout.put("Random number test",nl);
start:
add(1,x);
rand.randomize();
rand.urange(1,35); // pick a random number, 1 through 35
mov(eax,i); // move it into i variable
mov(i,eax); // set i to eax value
stdout.put(i,nl);
if(x<10) then
jmp start;
endif;
end random;

The HLA version gives the following 3 results:

Test #1
Random number test
29
24
11
19
22
8
27
33
27
28

Test #2
Random number test
19
4
32
30
23
34
24
20
20
30

Test #3
Random number test
35
26
29
17
26
18
33
29
19
1

Some repeats, but not as bad as before.

Is there a way to truly limit the number of repeats during a set of random number generation? I can foresee a lot of random numbers in my own mind, but they have to be truly, truly random for the random number generator to be doing a good job.

Any ideas as to why both sets of random number generators seem different in functionality?

Sincerely,

Paul Panks http://www.asmcommunity.net/board/cryptmail.php?tauntspiders=in.your.face@nomail.for.you&id=21d52567c8a753a5ea7638710b663a59
Posted on 2004-06-21 01:14:26 by Paul Panks
The call to randomize() shouldn't be placed inside of the loop, because it's purpose is to generate the initial seed for the PRNG.

Try running these programs:



1 CLEAR
5 CLS : PRINT "Random Number test"
10 RANDOMIZE TIMER
20 FOR x = 1 TO 10
30 i = INT(RND * 35) + 1
40 PRINT i
45 NEXT x




program random;
#include ("console.hhf");
#include ("stdlib.hhf");
#include ("math.hhf");
static
i:int32:=0;
x:int32:=0;
begin random;
console.cls();
stdout.put("Random number test",nl);
rand.randomize();
start:
add(1,x);
rand.urange(1,35); // pick a random number, 1 through 35
mov(eax,i); // move it into i variable
mov(i,eax); // set i to eax value
stdout.put(i,nl);
if(x<10) then
jmp start;
endif;
end random;


--
clone-d
Posted on 2004-06-21 07:38:41 by clone-d
He's right, and you have stumbled apon a much-overlooked property of pseudo-random generators, that for a given Seed, they will generate a given Series.
I use it as the basis for a cypher, can you think of other uses?
Posted on 2004-06-21 08:17:56 by Homer