/*
 OOK, the Only OK generator

 This generator is very small, and very fast,
 but the low order bits aren't all that great.

 It's main purpose is to provide a test vector 
 for Diehard C.

 I do not recommend using this generator.

*/

#define ulong unsigned long

static ulong ook_state1 = 1;
static ulong ook_state2 = 2;

void seedrand_ook(ulong seed) {
    ook_state1 = seed | 1;
    ook_state2 = seed | 2;
}

ulong rand_ook(void) {
    if (ook_state1&1) {
        ook_state1 = (ook_state1>>1) ^ 0xEDB88320l;
    } else {
        ook_state1 = (ook_state1>>1);
    }
    ook_state2 = (ook_state2 * 69069 + 17) & 0xffffffff;

    return ook_state1 ^ ook_state2;
}