thanks for that b32, i'll check out your gamebuilder too....
this is a C version if it helps too make things clearer, just messes with my head...
#include <math.h>
#include <stdlib.h>
unsigned short bd4Rand48_seed[3] = { 0x330e, 0xabcd, 0x1234 };
unsigned short bd4Rand48_mult[3] = { 0xe66d, 0xdeec, 0x0005 };
unsigned short bd4Rand48_add = 0x000b;
void bd4srand(long seed)
{
bd4Rand48_seed[0] = 0x330e;
bd4Rand48_seed[1] = (unsigned short) seed;
bd4Rand48_seed[2] = (unsigned short) (seed >> 16);
bd4Rand48_mult[0] = 0xe66d;
bd4Rand48_mult[1] = 0xdeec;
bd4Rand48_mult[2] = 5;
bd4Rand48_add = 0x000b;
}
double bd4rand(void)
{
unsigned long accu;
unsigned short temp[2];
accu = (unsigned long) bd4Rand48_mult[0] * (unsigned long) bd4Rand48_seed[0] +
(unsigned long) bd4Rand48_add;
temp[0] = (unsigned short) accu; /* lower 16 bits */
accu >>= sizeof(unsigned short) * 8;
accu += (unsigned long) bd4Rand48_mult[0] * (unsigned long) bd4Rand48_seed[1] +
(unsigned long) bd4Rand48_mult[1] * (unsigned long) bd4Rand48_seed[0];
temp[1] = (unsigned short) accu; /* middle 16 bits */
accu >>= sizeof(unsigned short) * 8;
accu += bd4Rand48_mult[0] * bd4Rand48_seed[2] + bd4Rand48_mult[1] * bd4Rand48_seed[1] + bd4Rand48_mult[2] * bd4Rand48_seed[0];
bd4Rand48_seed[0] = temp[0];
bd4Rand48_seed[1] = temp[1];
bd4Rand48_seed[2] = (unsigned short) accu;
return ldexp((double) bd4Rand48_seed[0], -48) +
ldexp((double) bd4Rand48_seed[1], -32) +
ldexp((double) bd4Rand48_seed[2], -16);
}
/**
* Basically copies a number of calls to a seeds drand48 with the "_add"
* variable changed from 0x0b==11 to 0x3d==61
*/
int bd4l(long key) {
unsigned short bd4l_seed[3] = { 0x330e, 0xabcd, 0x1234 };
unsigned short bd4l_mult[3] = { 0xe66d, 0xdeec, 0x0005 };
unsigned short bd4l_add = 61; /* 0x000b;*/
unsigned long accu;
unsigned short temp[2];
double tmp;
int i;
bd4l_seed[1] = (unsigned short) key;
bd4l_seed[2] = (unsigned short) (key >> 16);
/**
* Repreat random "drand48-similar" loop 5-15 times.
*
*/
for(i=-5;i<(key%10);i++) {
accu = (unsigned long) bd4l_mult[0] * (unsigned long) bd4l_seed[0] +
(unsigned long) bd4l_add;
temp[0] = (unsigned short) accu; /* lower 16 bits */
accu >>= sizeof(unsigned short) * 8;
accu += (unsigned long) bd4l_mult[0] * (unsigned long) bd4l_seed[1] +
(unsigned long) bd4l_mult[1] * (unsigned long) bd4l_seed[0];
temp[1] = (unsigned short) accu; /* middle 16 bits */
accu >>= sizeof(unsigned short) * 8;
accu += bd4l_mult[0] * bd4l_seed[2] + bd4l_mult[1] * bd4l_seed[1] + bd4l_mult[2] * bd4l_seed[0];
bd4l_seed[0] = temp[0];
bd4l_seed[1] = temp[1];
bd4l_seed[2] = (unsigned short) accu;
}
tmp = ldexp((double) bd4l_seed[0], -48) +
ldexp((double) bd4l_seed[1], -32) +
ldexp((double) bd4l_seed[2], -16);
return 9787*tmp;
}