LFIB4

From JBWiki
Jump to: navigation, search

Javascript

function LFIB4() {
  return(function(args) {
    // George Marsaglia's LFIB4,
    //http://groups.google.com/group/sci.crypt/msg/eb4ddde782b17051
    var k0 = 0,
        k1 = 58,
        k2 = 119,
        k3 = 178;
 
    var s = [];
 
    var mash = Mash();
    if (args.length === 0) {
      args = [+new Date()];
    }
    for (var j = 0; j < 256; j++) {
      s[j] = mash(' ');
      s[j] -= mash(' ') * 4.76837158203125e-7; // 2^-21
      if (s[j] < 0) {
        s[j] += 1;
      }
    }
    for (var i = 0; i < args.length; i++) {
      for (var j = 0; j < 256; j++) {
        s[j] -= mash(args[i]);
        s[j] -= mash(args[i]) * 4.76837158203125e-7; // 2^-21
        if (s[j] < 0) {
          s[j] += 1;
        }
      }
    }
    mash = null;
 
    var random = function() {
      var x;
 
      k0 = (k0 + 1) & 255;
      k1 = (k1 + 1) & 255;
      k2 = (k2 + 1) & 255;
      k3 = (k3 + 1) & 255;
 
      x = s[k0] - s[k1];
      if (x < 0) {
        x += 1;
      }
      x -= s[k2];
      if (x < 0) {
        x += 1;
      }
      x -= s[k3];
      if (x < 0) {
        x += 1;
      }
 
      return s[k0] = x;
    }
 
    random.uint32 = function() {
      return random() * 0x100000000 >>> 0; // 2^32
    };
    random.fract53 = random;
    random.version = 'LFIB4 0.9';
    random.args = args;
 
    return random;
  } (Array.prototype.slice.call(arguments)));
}

C

#include <stdio.h>
#include <stdint.h>
#include "mash.h"
 
// George Marsaglia's LFIB4,
//http://groups.google.com/group/sci.crypt/msg/eb4ddde782b17051
const double norm21 = 4.76837158203125e-7;      // 2^-21
 
static double s[256];
static uint8_t k0 = 0, k1 = 58, k2 = 119, k3 = 178;
 
static inline double lfib4(void) {
  double x;
 
  k0++;
  k1++;
  k2++;
  k3++;
 
  x = s[k0] - s[k1];
  if (x < 0.0) {
    x += 1.0;
  }
  x -= s[k2];
  if (x < 0.0) {
    x += 1.0;
  }
  x -= s[k3];
  if (x < 0.0) {
    x += 1.0;
  }
 
  return s[k0] = x;
}
 
int main(int argc, unsigned char *argv[]) {
  double buffer[256];
  int i, j;
 
  for (j = 0; j < 256; j++) {
    s[j] = mash(" ");
    s[j] -= mash(" ") * norm21;  // 2^-21
    if (s[j] < 0.0) {
      s[j] += 1.0;
    }
  }
  for (i = 1; i < argc; i++) {
    for (j = 0; j < 256; j++) {
      s[j] -= mash(argv[i]);
      s[j] -= mash(argv[i]) * norm21;   // 2^-21
      if (s[j] < 0.0) {
        s[j] += 1.0;
      }
    }
  }
 
  while (1) {
    for (i = 0; i < 256; i++) {
      buffer[i] = lfib4();
    }
    fwrite(buffer, sizeof buffer, 1, stdout);
  }
}
Personal tools
Namespaces
Variants
Actions
Navigation
Toolbox