GLBasic forum

Main forum => Bug Reports => Topic started by: shadok85 on 2010-Sep-23

Title: RND or SEEDRND bug?
Post by: shadok85 on 2010-Sep-23
Hi all!
I have a problem with the RND function (or SEEDRND, perhaps): whenever I want a random numbers, I pick always the same sequence of digits. Example:

Code (glbasic) Select

LIMITFPS 60
SEEDRND GETTIMERALL()

LOCAL nums%[]
DIM nums%[6]

FOR i=0 TO 5
nums[i] = 1 + RND(90)
NEXT

WHILE TRUE
CLEARSCREEN

IF KEY(57)
FOR i=0 TO 5
nums[i] = 1 + RND(90)
NEXT
ENDIF

FOR i=0 TO 5
PRINT nums[i], 0, i*8
NEXT

SHOWSCREEN
SLEEP 100
WEND


Check by yourself. On the first run, you will got always 39, 9, 15, 20, 71, 14. Why?
Title: Re: RND or SEEDRND bug?
Post by: Minion on 2010-Sep-23
GETTIMERALL() Starts the time from the moment the program started running, so will always (in theory) be the same every time you run. Sadly Im not sure how to get the system time in order to create the random number seed
Title: Re: RND or SEEDRND bug?
Post by: MrTAToad on 2010-Sep-23
I get completely different numbers with each run.  What platform are you running it on ?
Title: Re: RND or SEEDRND bug?
Post by: Slydog on 2010-Sep-23
I think I remember this problem from a few months ago.
On some platforms the result for either SEEDRND() or GETTIMERALL() are 16 bit integers and other platforms are 32 bit integers (or 32 bit and 64 bit).
So on some platforms some bits are shaved off not giving a random seed value.

Try the work around by 'Ocean' in this forum:
http://www.glbasic.com/forum/index.php?topic=4917.msg37548#msg37548 (http://www.glbasic.com/forum/index.php?topic=4917.msg37548#msg37548)
Title: Re: RND or SEEDRND bug?
Post by: Kitty Hello on 2010-Sep-23
best was:
http://www.glbasic.com/forum/index.php?topic=4243.msg31492#msg31492 (http://www.glbasic.com/forum/index.php?topic=4243.msg31492#msg31492)
Title: Re: RND or SEEDRND bug?
Post by: Slydog on 2010-Sep-23
Which suggestion on that forum?

Code (glbasic) Select
SEEDRND MID$(PLATFORMINFO$("time"), 17, 2)
This one had a comment: "This works sometimes but there are still often the same results. "

or this one:
Code (glbasic) Select
LOCAL TickCount
INLINE
DECLARE_C_ALIAS(GLBGetTickCount,"kernel32.dll", "GetTickCount",(),int);
TickCount = GLBGetTickCount();
ENDINLINE
SEEDRND TickCount

The second one uses "kernal32.dll" which would only work on a Windows machine.
Is there equivalent INLINE calls for the other platforms?

[Edit]
Here's the English translation if you need it:
http://translate.google.com/translate?js=n&prev=_t&hl=en&ie=UTF-8&layout=2&eotf=1&sl=de&tl=en&u=http%3A%2F%2Fwww.glbasic.com%2Fforum%2Findex.php%3Ftopic%3D4243.msg31492%23msg31492 (http://translate.google.com/translate?js=n&prev=_t&hl=en&ie=UTF-8&layout=2&eotf=1&sl=de&tl=en&u=http%3A%2F%2Fwww.glbasic.com%2Fforum%2Findex.php%3Ftopic%3D4243.msg31492%23msg31492)
Title: Re: RND or SEEDRND bug?
Post by: shadok85 on 2010-Sep-23
Quote from: MrTAToad on 2010-Sep-23
I get completely different numbers with each run.  What platform are you running it on ?

I'm running it on Vista 32 bit.

Well, I have the free version of GLBasic, so I can't use INLINE. Even if I could use the INLINE command, it's not portable. Instead the snippet made by Ocean works very well. So thank you for your responses!
Title: Re: RND or SEEDRND bug?
Post by: shadok85 on 2010-Sep-23
Quote from: Ocean on 2010-Sep-23
For a portable solution you might also want to evaluate this:
http://www.glbasic.com/forum/index.php?topic=4917.msg37547#msg37547

cheers
Ocean

Yeah, now I'm using your snippet, thank you!
Title: Re: RND or SEEDRND bug?
Post by: MrTAToad on 2010-Sep-23
QuoteI'm running it on Vista 32 bit.
Using Windows 7 x64 here...