There are many ways to generate a random number based on how many bits you want and how random it has to be.

It is important to remember three things:

  1. Computers are not random; as such they can only generate pseudo-random numbers (numbers which seem random but eventually repeat or show a pattern).
  2. User input is pretty random, and is a very useful thing for making numbers more random.
  3. If you give a random number generator the same seed, you will get the same output. So use user input to seed the generator.

The r register can be used too, since its value will be fairly random when observed infrequently, but many emulators don't emulate it and (if emulated correctly, or on hardware) it only provides 7 bits of data.

An easy and effective way to seed a generator is to simply increment (or otherwise modify) its seed once per frame, and/or increment/modify it based on user input. The important part is to then pass these seed data into an algorithm that produces pseudo-randomly-distributed results, which have little correlation to the input data.

Phantasy Star's random number generator

; Uses a 16-bit RAM variable called RandomNumberGeneratorWord
; Returns an 8-bit pseudo-random number in a
    push hl
        ld hl,(RandomNumberGeneratorWord)
        ld a,h         ; get high byte
        rrca           ; rotate right by 2
        xor h          ; xor with original
        rrca           ; rotate right by 1
        xor l          ; xor with low byte
        rrca           ; rotate right by 4
        xor l          ; xor again
        rra            ; rotate right by 1 through carry
        adc hl,hl      ; add RandomNumberGeneratorWord to itself
        jr nz,+
        ld hl,$733c    ; if last xor resulted in zero then re-seed random number generator
+:      ld a,r         ; r = refresh register = semi-random number
        xor l          ; xor with l which is fairly random
        ld (RandomNumberGeneratorWord),hl
    pop hl
    ret                ; return random number in a

Return to top