LFib
From JBWiki
Javascript
function LFib() { return (function(args) { var k0 = 255, k1 = 52, k2 = 0; 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() { k0 = (k0 + 1) & 255; k1 = (k1 + 1) & 255; k2 = (k2 + 1) & 255; var x = s[k0] - s[k1]; if (x < 0.0) { x += 1.0; } x -= s[k2]; if (x < 0.0) { x += 1.0; } return s[k0] = x; } random.uint32 = function() { return random() * 0x100000000 >>> 0; // 2^32 }; random.fract53 = random; random.version = 'LFib 0.9'; random.args = args; return random; } (Array.prototype.slice.call(arguments))); }
C
#include <stdio.h> #include <stdint.h> #include "mash.h" const double norm21 = 4.76837158203125e-7; // 2^-21 static double s[256]; static uint8_t k0 = 255, k1 = 52, k2 = 0; static inline double lfib(void) { double x; k0++; k1++; k2++; x = s[k0] - s[k1]; if (x < 0.0) { x += 1.0; } x -= s[k2]; 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] = lfib(); } fwrite(buffer, sizeof buffer, 1, stdout); } }