BBC BASIC for Windows
« problem with PRINT RND »

Welcome Guest. Please Login or Register.
Apr 5th, 2018, 10:19pm



ATTENTION MEMBERS: Conforums will be closing it doors and discontinuing its service on April 15, 2018.
Ad-Free has been deactivated. Outstanding Ad-Free credits will be reimbursed to respective payment methods.

If you require a dump of the post on your message board, please come to the support board and request it.


Thank you Conforums members.

BBC BASIC for Windows Resources
Online BBC BASIC for Windows documentation
BBC BASIC for Windows Beginners' Tutorial
BBC BASIC Home Page
BBC BASIC on Rosetta Code
BBC BASIC discussion group
BBC BASIC for Windows Programmers' Reference

« Previous Topic | Next Topic »
Pages: 1  Notify Send Topic Print
 thread  Author  Topic: problem with PRINT RND  (Read 800 times)
Jonathan Zerd
Guest
question problem with PRINT RND
« Thread started on: Feb 20th, 2010, 6:33pm »

Hello, i am a newbie at programming and i need some help with the
function PRINT RND. The problem is that while i am trying to create
a KENO-like game, i can't tell the machine how not to generate the same numbers.Here is the code;
INPUT "how many numbers? " Op%
IF Op%=1 THEN
INPUT "guess a number: " Num1
PRINT RND(8)
PRINT RND(8)
PRINT RND(8)
...
...
Thank you in advance, Jo
User IP Logged

MALCOLM
Guest
question Re: problem with PRINT RND
« Reply #1 on: Feb 20th, 2010, 7:10pm »

I think you are saying that you keep getting the same number sequence.

You can avoid this by giving the RND function a seed.
Here is one that was suggested some time ago.

REM Randomize the RND function. (Otherwise it is predictable.)
SYS "QueryPerformanceCounter", ^pc%
seed% = RND(-ABS(pc%))

seed% is not used after this it, is just somewhere to catch the value.

The performance counter will give a "randomish" seed to the pseudo random RND. That should be enough randomization.
User IP Logged

David Williams
Developer

member is offline

Avatar

meh


PM

Gender: Male
Posts: 452
question Re: problem with PRINT RND
« Reply #2 on: Feb 20th, 2010, 7:45pm »

I use R% = RND(-TIME) to seed BB4W's pseudo-random number generator.

It's nearly always sufficient for my purposes, but possibly not as 'good' as the method suggested by Malcolm.


[EDIT: In fact, it's definitely not as good as Malcolm's method.]



David.
« Last Edit: Feb 20th, 2010, 7:52pm by David Williams » User IP Logged

Malcolm
Guest
question Re: problem with PRINT RND
« Reply #3 on: Feb 20th, 2010, 7:56pm »

Actually it was a discussion between Richard and Jon where this came up.

And there is a actually problem with using a variable like pc% it's too small.

SYS "QueryPerformanceCounter", ^T%
seed% = RND(-ABS(T%))

Now that works. Note that variable U% is also written to.
The returned data is bigger than one integer's worth so it overflows into the next static variable.

The discussion is Message 5168 on the BB4W group.
User IP Logged

Richard Russell
Guest
question Re: problem with PRINT RND
« Reply #4 on: Feb 20th, 2010, 11:01pm »

on Feb 20th, 2010, 6:33pm, Guest-Jonathan Zerd wrote:
I can't tell the machine how not to generate the same numbers.

If I understand your question correctly, you want to generate a set of 'random' numbers in which you can guarantee the same value won't appear more than once.

Supposing you want to choose six lotto numbers, each from the range 1 to 49, but the same number mustn't be used twice. This is one way to do it:

Code:
      total = 49
      DIM lotto(total)
      FOR I = 1 TO total
        lotto(I) = I
      NEXT I
      FOR choice = 1 TO 6
        R = RND(total)
        PRINT lotto(R)
        lotto(R) = total
        total = total-1
      NEXT choice 


Each time around the loop the program chooses only from the numbers that are left, so the same number cannot be chosen twice. This exactly mimics what happens in a real lottery machine.

The issue of not choosing the same number more than once has nothing to do with the degree of 'randomness'.

Richard.
User IP Logged

Richard Russell
Guest
question Re: problem with PRINT RND
« Reply #5 on: Feb 20th, 2010, 11:07pm »

on Feb 20th, 2010, 7:56pm, Guest-Malcolm wrote:
SYS "QueryPerformanceCounter", ^T%
seed% = RND(-ABS(T%))

Please... we have structures now!! There's no reason to use this horrible technique any more. Far better to use:

Code:
      DIM pc{l%,h%}
      SYS "QueryPerformanceCounter", pc{}
      seed% = RND(-ABS(pc.l%)) 

And, yes, I know there is some example code in the BB4W docs which still uses the ^V% technique; I only spotted it recently and it's already been fixed in the online version.

Richard.
User IP Logged

Malcolm
Guest
question Re: problem with PRINT RND
« Reply #6 on: Feb 21st, 2010, 5:47pm »


All of which says that R% = RND(-TIME) probably is as good as any means.

But your interpretation of the original question is probably right so randomization it isn't needed in this instance.

I am going back and fixing all my shuffle routines.

User IP Logged

Pages: 1  Notify Send Topic Print
« Previous Topic | Next Topic »

| |

This forum powered for FREE by Conforums ©
Terms of Service | Privacy Policy | Conforums Support | Parental Controls