RNG

From Ukikipedia
Jump to navigation Jump to search

RNG or Random Number Generation is the game's method of generating a random short. By doing this, the game can make things like dust movement seem random.

Technical description

The RNG variable is a short, which is a number from 0 to 65535 inclusive. When an object, snow, or something else wants to call RNG, it takes the current RNG value and runs it through the RNG function, below. It uses the result in its own calculations and also stores the result to the RNG variable. Thus, the RNG variable is equal to the last used RNG value.

The RNG function

unsigned short rng_function (unsigned short input) {
    if (input == 0x560A) input = 0;
    unsigned short S0 = (unsigned char)input << 8;
    S0 = S0 ^ input;
    input = ((S0 & 0xFF) << 8) | ((S0 & 0xFF00) >> 8);
    S0 = ((unsigned char)S0 << 1) ^ input;
    short S1 = (S0 >> 1) ^ 0xFF80;
    if ((S0 & 1) == 0) {
        if (S1 == 0xAA55) input = 0;
        else input = S1 ^ 0x1FF4;
    }
    else input = S1 ^ 0x8180;
    return (unsigned short)input;
}

Description

A graph showing notable RNG values and indeces in SM64.

The function has 65536 possible inputs and 65536 possible outputs. It is a bijection, meaning that every input maps to exactly one output and none repeat or are left out. The function forms two loops, one of length 65534 and one of length 2, but one of the if statements causes the cycle of 2 to lead back to the cycle of 65534. Oddly, the RNG value of 21674 at index 65113 loops back to index 0.

Objects that call RNG