RND: Difference between revisions

From QB64 Phoenix Edition Wiki
Jump to navigation Jump to search
(Created page with "The '''RND''' function returns a random number with a value between 0 (inclusive) and 1 (exclusive). {{PageSyntax}} :: result! = RND [(''n'')] {{Parameters}} * ''n'' is a SINGLE numeric value that defines the behavior of the RND function but is '''NOT normally required''': ::n parameter omitted: Returns next random number in the sequence. ::n = 0: Return the last value returned. ::n < 0: Always returns the same value for any given n ::n > 0: the sequence of...")
 
No edit summary
 
(8 intermediate revisions by the same user not shown)
Line 2: Line 2:




{{PageSyntax}}  
{{PageSyntax}}
:: result! = [[RND]] [(''n'')]
:: result! = [[RND]] [(''n'')]




{{Parameters}}
{{PageParameters}}
* ''n'' is a [[SINGLE]] numeric value that defines the behavior of the RND function but is '''NOT normally required''':
* ''n'' is a [[SINGLE]] numeric value that defines the behavior of the RND function but is '''NOT normally required''':
::n parameter omitted: Returns next random number in the sequence.
::n parameter omitted: Returns next random number in the sequence.
::n = 0: Return the last value returned.
::n = 0: Return the last value returned.
::n < 0: Always returns the same value for any given n
::n < 0: Always returns the same value for any given n
::n > 0: the sequence of numbers generated will not change unless [[RANDOMIZE]] is initiated.  
::n > 0: the sequence of numbers generated will not change unless [[RANDOMIZE]] is initiated.




Line 20: Line 20:
* If you need an integer range of numbers, like a dice roll, round it down to an [[INT]]. Add 1 to the maximum number with [[INT]].
* If you need an integer range of numbers, like a dice roll, round it down to an [[INT]]. Add 1 to the maximum number with [[INT]].
* The random sequence is 2 ^ 24 or 16,777,216 entries long, which can allow repeated patterns in some procedures.
* The random sequence is 2 ^ 24 or 16,777,216 entries long, which can allow repeated patterns in some procedures.
* Formulas for the [[INT|Integer]] or [[CINT|Closest Integer]] of ANY number range from ''min%''(lowest value) to ''max%''(greatest value):  
* Formulas for the [[INT|Integer]] or [[CINT|Closest Integer]] of ANY number range from ''min%''(lowest value) to ''max%''(greatest value):
::* Using [[INT]]: randNum% = INT(RND * (max% - min% + 1)) + min%
::* Using [[INT]]: randNum% = INT(RND * (max% - min% + 1)) + min%
::* Using [[CINT]]: randNum% = CINT(RND * (max% - min%)) + min%
::* Using [[CINT]]: randNum% = CINT(RND * (max% - min%)) + min%
* Use [[RANDOMIZE]] [[TIMER]] for different random number results each time a program is run.  
* Use [[RANDOMIZE]] [[TIMER (function)|TIMER]] for different random number results each time a program is run.
* [[RUN]] should reset the [[RANDOMIZE]] sequence to the starting [[RND]] function value.(Not yet in QB64)
* [[RUN]] should reset the [[RANDOMIZE]] sequence to the starting [[RND]] function value.(Not yet in QB64)


Line 29: Line 29:
''Example 1:'' Generating a random integer value between 1 and 6 (inclusive) using INT.
''Example 1:'' Generating a random integer value between 1 and 6 (inclusive) using INT.
{{CodeStart}}
{{CodeStart}}
dice% = {{Cl|INT}}({{Cl|RND}} * 6) + 1 '' '' 'add one as INT value never reaches 6  
dice% = {{Cl|INT}}({{Cl|RND}} * 6) + 1 'add one as INT value never reaches 6
{{CodeEnd}}
{{CodeEnd}}




''Example 2:'' Using uniform random numbers to create random numbers with a gaussian distribution ([http://en.wikipedia.org/wiki/Marsaglia_polar_method| Marsaglia's polar method]).
''Example 2:'' Using uniform random numbers to create random numbers with a gaussian distribution ([[Wikipedia:Marsaglia polar method|Marsaglia's polar method]]).
{{CodeStart}} '' ''
{{CodeStart}}
{{Cl|DO}}
{{Cl|DO}}
   u! = {{Cl|RND}} * 2 - 1
   u! = {{Cl|RND}} * 2 - 1
Line 42: Line 42:
s! = SQR(-2 * {{Cl|LOG}}(s!) / s!) * 0.5
s! = SQR(-2 * {{Cl|LOG}}(s!) / s!) * 0.5
u! = u! * s!
u! = u! * s!
v! = v! * s! '' ''
v! = v! * s!
{{CodeEnd}}
{{CodeEnd}}
:''Explanation:'' Values ''u!'' and ''v!'' are now two independent random numbers with gaussian distribution, centered at 0.
:''Explanation:'' Values ''u!'' and ''v!'' are now two independent random numbers with gaussian distribution, centered at 0.
Line 48: Line 48:


''Example 3:'' Random flashes from an explosion
''Example 3:'' Random flashes from an explosion
{{CodeStart}} '' ''
{{CodeStart}}
{{Cl|SCREEN}} {{Cl|_NEWIMAGE}}(640, 480, 32)
{{Cl|SCREEN}} {{Cl|_NEWIMAGE}}(640, 480, 32)
{{Cl|RANDOMIZE}} {{Cl|TIMER}}
{{Cl|RANDOMIZE}} {{Cl|TIMER (function)|TIMER}}
BC = 120 ' BALL COUNT
BC = 120 ' BALL COUNT
{{Cl|DIM}} ballx(1 {{Cl|TO}} BC)
{{Cl|DIM}} ballx(1 {{Cl|TO}} BC)
Line 97: Line 97:
     {{Cl|NEXT}} J
     {{Cl|NEXT}} J


{{Cl|LOOP}} {{Cl|UNTIL}} {{Cl|INKEY$}} <> "" '' ''
{{Cl|LOOP}} {{Cl|UNTIL}} {{Cl|INKEY$}} <> ""
{{CodeEnd}} {{small|Code by Falcon}}
{{CodeEnd}}
{{Small|Code by Falcon}}




{{PageSeeAlso}}
{{PageSeeAlso}}
* [[RANDOMIZE]], [[TIMER]]
* [[RANDOMIZE]], [[TIMER (function)]]
* [[INT]], [[CINT]], [[FIX]]
* [[INT]], [[CINT]], [[FIX]]




{{PageNavigation}}
{{PageNavigation}}

Latest revision as of 16:32, 14 June 2024

The RND function returns a random number with a value between 0 (inclusive) and 1 (exclusive).


Syntax

result! = RND [(n)]


Parameters

  • n is a SINGLE numeric value that defines the behavior of the RND function but is NOT normally required:
n parameter omitted: Returns next random number in the sequence.
n = 0: Return the last value returned.
n < 0: Always returns the same value for any given n
n > 0: the sequence of numbers generated will not change unless RANDOMIZE is initiated.


Description

  • The random numbers generated range from 0 minimum to .9999999 maximum SINGLE values that never equal 1.
  • To get values in a range larger than 1, multiply RND with a number to get returns up to but not including that numerical value.
  • To get values starting at a certain number, add that number to the RND result as RND minimums can be 0.
  • If you need an integer range of numbers, like a dice roll, round it down to an INT. Add 1 to the maximum number with INT.
  • The random sequence is 2 ^ 24 or 16,777,216 entries long, which can allow repeated patterns in some procedures.
  • Formulas for the Integer or Closest Integer of ANY number range from min%(lowest value) to max%(greatest value):
  • Using INT: randNum% = INT(RND * (max% - min% + 1)) + min%
  • Using CINT: randNum% = CINT(RND * (max% - min%)) + min%
  • Use RANDOMIZE TIMER for different random number results each time a program is run.
  • RUN should reset the RANDOMIZE sequence to the starting RND function value.(Not yet in QB64)


Example 1: Generating a random integer value between 1 and 6 (inclusive) using INT.

dice% = INT(RND * 6) + 1 'add one as INT value never reaches 6


Example 2: Using uniform random numbers to create random numbers with a gaussian distribution (Marsaglia's polar method).

DO
  u! = RND * 2 - 1
  v! = RND * 2 - 1
  s! = u! * u! + v! * v!
LOOP WHILE s! >= 1 OR s! = 0
s! = SQR(-2 * LOG(s!) / s!) * 0.5
u! = u! * s!
v! = v! * s!
Explanation: Values u! and v! are now two independent random numbers with gaussian distribution, centered at 0.


Example 3: Random flashes from an explosion

SCREEN _NEWIMAGE(640, 480, 32)
RANDOMIZE TIMER
BC = 120 ' BALL COUNT
DIM ballx(1 TO BC)
DIM bally(1 TO BC)
DIM velx(1 TO BC)
DIM vely(1 TO BC)
DIM bsize(1 TO BC)
Y = INT(RND * (400 - 100 + 1)) + 100
X0 = 325
Y0 = 300
Tmax = 150
DO
    FOR p = 1 TO BC
        T = INT(RND * (Tmax - 50 + 1)) + 50
        X = INT(RND * (1000 + 500 + 1)) - 500
        velx(p) = (X - X0) / T '                       calculate velocity based on flight time
        vely(p) = -1 * (Y - .05 * (T ^ 2 + 20 * Y0)) / (T) ' verticle velocity
    NEXT p

    FOR w = 1 TO BC
        bsize(w) = INT(RND * (10 - 0 + 1)) + 0 'size
    NEXT w

    FOR J = 1 TO Tmax
        _LIMIT 60
        CLS
        'FOR i = 0 TO 255 STEP .5
        'CIRCLE (X0, Y0), i, _RGB(255 - i, 0, 0), 0, 3.147
        ' NEXT i

        R = INT(RND * (25 - 20 + 1)) + 20 'random glimmer
        FOR z = 1 TO BC
            ballx(z) = X0 + velx(z) * J
            bally(z) = Y0 - vely(z) * J + .5 * .1 * J ^ 2
        NEXT z

        FOR d = 1 TO BC
            RCOL = INT(RND * (255 - 0 + 1)) 'color
            FOR i = 0 TO bsize(d) + 1 STEP .4 'draw balls
                CIRCLE (ballx(d), bally(d)), i, _RGBA(255, RCOL - (R * i), RCOL - R * i, 255)
            NEXT i
        NEXT d

        _DISPLAY

    NEXT J

LOOP UNTIL INKEY$ <> ""
Code by Falcon


See also



Navigation:
Main Page with Articles and Tutorials
Keyword Reference - Alphabetical
Keyword Reference - By usage
Report a broken link