Xorshift03

From JBWiki
Jump to: navigation, search

Javascript

  function Xorshift03() {
    return (function(args) {
      // George Marsaglia, 13 May 2003
      // http://groups.google.com/group/comp.lang.c/msg/e3c4ea1169e463ae
      var x = 123456789,
          y = 362436069,
          z = 521288629,
          w = 88675123,
          v = 886756453;
 
      if (args.length == 0) {
        args = [+new Date];
      }
      var mash = Mash();
      for (var i = 0; i < args.length; i++) {
        x ^= mash(args[i]) * 0x100000000; // 2^32
        y ^= mash(args[i]) * 0x100000000;
        z ^= mash(args[i]) * 0x100000000;
        v ^= mash(args[i]) * 0x100000000;
        w ^= mash(args[i]) * 0x100000000;
      }
      mash = null;
 
      var uint32 = function() {
        var t = (x ^ (x >>> 7)) >>> 0;
        x = y;
        y = z;
        z = w;
        w = v;
        v = (v ^ (v << 6)) ^ (t ^ (t << 13)) >>> 0;
        return ((y + y + 1) * v) >>> 0;
      }
 
      var random = function() {
        return uint32() * 2.3283064365386963e-10; // 2^-32
      };
      random.uint32 = uint32;
      random.fract53 = function() {
        return random() +
          (uint32() & 0x1fffff) * 1.1102230246251565e-16; // 2^-53
      };
      random.version = 'Xorshift03 0.9';
      random.args = args;
      return random;
 
    } (Array.prototype.slice.call(arguments)));
  };

C

#include <stdio.h>
#include <stdint.h>
#include "mash.h"
 
// George Marsaglia, 13 May 2003
// http://groups.google.com/group/comp.lang.c/msg/e3c4ea1169e463ae
 
const double norm32 = 2.3283064365386963e-10;   // 2^-32
 
static uint32_t x = 123456789, y = 362436069,
  z = 521288629, w = 88675123, v = 886756453;
 
double xorshift03(void) {
  unsigned long t;
  t = (x ^ (x >> 7));
  x = y;
  y = z;
  z = w;
  w = v;
  v = (v ^ (v << 6)) ^ (t ^ (t << 13));
  return (y + y + 1) * v * norm32;      // 2^-32
}
 
int main(int argc, unsigned char *argv[]) {
  double buffer[256];
  int i;
 
  for (i = 1; i < argc; i++) {
    x ^= (uint32_t) (mash(argv[i]) * 0x100000000ULL);   // 2^32
    y ^= (uint32_t) (mash(argv[i]) * 0x100000000ULL);   // 2^32
    z ^= (uint32_t) (mash(argv[i]) * 0x100000000ULL);   // 2^32
    v ^= (uint32_t) (mash(argv[i]) * 0x100000000ULL);   // 2^32
    w ^= (uint32_t) (mash(argv[i]) * 0x100000000ULL);   // 2^32
  }
 
  while (1) {
    for (i = 0; i < 256; i++) {
      buffer[i] = xorshift03();
    }
    fwrite(buffer, sizeof buffer, 1, stdout);
  }
}
Personal tools
Namespaces
Variants
Actions
Navigation
Toolbox