Author Topic: Extremely simple and fast XorShift randomizer  (Read 2343 times)

Offline Wampus

  • Prof. Inline
  • *****
  • Posts: 1004
    • View Profile
The code below creates medium quality pseudorandom numbers using Xorshift. With better quality pseudorandom number generation that is almost as fast the Mersenne Twister code found on this forum would be a better choice for most tasks. I thought I'd post this Xorshift code anyway.

XorShiftSeed(num) - Sets the Xorshift randomizer with seed num.

XorShift(maxnum) - Generates a random number with the range 0 to maxnum-1.

Code: GLBasic [Select]
INLINE

static unsigned long xxs=123456789, yxs=362436069, zxs=521288629;

unsigned long xorshrseed(unsigned long int SeedNumXS) {
xxs = SeedNumXS, yxs=362436069, zxs=521288629;
}

unsigned long xorshf(unsigned long int mmaxNumXS) {      
unsigned long txs;
xxs ^= xxs << 21;
xxs ^= xxs >> 35;
xxs ^= xxs << 4;

txs = xxs;
xxs = yxs;
yxs = zxs;
zxs = txs ^ xxs ^ yxs;

return (zxs % mmaxNumXS);
}

ENDINLINE



FUNCTION XorShiftSeed: snum

INLINE
        xorshrseed((unsigned long) snum);
ENDINLINE

ENDFUNCTION



FUNCTION XorShift: mnum

INLINE
        return xorshf((unsigned long) mnum);
ENDINLINE

ENDFUNCTION