RND
BASIC keyword | |
Keyword: | RND |
Abbreviation: | R, Shift+N |
Type: | Function |
Token code: | 187/$BB |
Handling routine in BASIC ROM: |
57495–57592 $E097–E0F8 |
List of all BASIC keywords |
Remark: This article describes the BASIC command RND in BASIC V2 on the Commodore 64.
Typ: Function General Programming Syntax: RND(<Number>)
The function RND generates random floating point numbers in the range of 0.0 (inclusive) to 1.0 (exclusive). The argument <number> can be positive, negative or zero.
- By using RND(<positive number>) gives a different random number each time from a predetermined sequence (the sequence number is stored internally).
- Using RND(<negative number>) jumps to a point in the sequence determined by the particular negative number used. Repeatedly calling RND with the same negative number results in the same result; typical use is to call RND(<negative number>) once and then repeatedly call RND(<positive number>).
- With RND(0) the C64 generates the random number from the internal clock, though the possible values are limited as the digits of the clock only fall in the range 0-60, so it is not suitable for generating large ranges.
When using a invalid numeric value, the BASIC error ?TYPE MISMATCH ERROR appears. When the numeric argument is absent, it appears as ?SYNTAX ERROR.
Examples[edit | edit source]
X = RND(-TI) : REM Initialising PRINT INT(RND(1)*100) : REM Integer random numbers from 0 to 99 PRINT INT(RND(1)*6)+1 : REM Integer random numbers from 1 to 6 (for dice simulation) PRINT INT(RND(1)*49)+1 : REM Integer random number from 1 to 49 (for lotto simulation, for example famous German lotto 6 out 49) PRINT (RND(0)*101)+100 : REM Random numbers from 100 to 201
Using the real-time clock for initialising the RND function.
POKE 56328,0 : REM real-time clock activate with 1/10s -> clock runs ($DC08) PRINT RND(0) : REM Random number addicted by timer and real-time clock
This example shows why the command RND(0)
isn't very good, when compared to the command RND(1)
:
10 REM THIS PROGRAM SHOWS THE DIFFERENCE BETWEEN RND(0) AND RND(1). 20 REM 1000 ASTERISKS WILL BE GENERATED FOR RND(0), 30 REM AFTER THIS HAS FINISHED PRESS ANY KEY TO START RND(1). 40 FOR I=0 TO 1 50 PRINT CHR$(147): REM CLEARS SCREEN 60 POKE 53280,0: REM SETS BORDER COLOUR 70 FOR J=1 TO 1000 80 POKE 1024+INT(RND(I)*1000),42: NEXT 90 PRINT "{WHITE}{HOME}RND(";I;"){LT. BLUE}": REM {LT. BLUE}=LIGHT BLUE 100 POKE 53280,14: REM "RESETS" BORDER COLOUR 110 WAIT 198,1: REM WAITS UNTIL A KEY IS PRESSED 120 GET A$: NEXT 130 PRINT CHR$(147)
With RND(0)
you see a pattern. This is because RND(0)
can only generate 256 numbers. For filling out the screen with asterisks (*) you need 1000 characters, but do note that this code does not look whether a spot is filled with an asterisk or not, so it may write an asterisk where there was already one, making it look like fewer asterisks were written.
ABS | AND | ASC | ATN | CHR$ | CLOSE | CLR | CMD | CONT | COS | DATA | DEF | DIM | END | EXP | FN | FOR | FRE | GET | GET# | GOSUB | GOTO | IF | INPUT | INPUT# | INT | LEFT$ | LEN | LET | LIST | LOAD | LOG | MID$ | NEW | NEXT | NOT | ON | OPEN | OR | PEEK | π | POKE | POS | PRINT | PRINT# | READ | REM | RESTORE | RETURN | RIGHT$ | RND | RUN | SAVE | SGN | SIN | SPC | SQR | STATUS/ST | STEP | STOP | STR$ | SYS | TAB | TAN | THEN | TIME/TI | TIME$/TI$ | TO | USR | VAL | VERIFY | WAIT