uint64_t xorshift64star_uniform( uint64_t range ) { if (range == 0 || range == 1) { return 0; } uint64_t cutoff = UINT64_MAX - ( UINT64_MAX % range ); uint64_t result; while (( result = xorshift64star( )) > cutoff ) ; return result % range; }
static void array_init(void) { for (int i = 0; i < ARRAY_SIZE; i++) array[i] = i; for (int i = ARRAY_SIZE - 1; i > 0; i--) { int swap = xorshift64star() % (i + 1); int tmp = array[i]; array[i] = array[swap]; array[swap] = tmp; } }
static int iter_sample(strm_stream* strm, strm_value data) { struct sample_data* d = strm->data; uint64_t r; if (d->i < d->len) { d->samples[d->i++] = data; return STRM_OK; } xorshift64init(); r = xorshift64star()%(d->i); if (r < d->len) { d->samples[r] = data; } d->i++; return STRM_OK; }
int main() { int k; uint64_t s[16]; initxorshift64star(0x1234567887654321); printf("Seed:\n"); for (k = 0; k < 16; ++k) { s[k] = xorshift64star(); printf("%2d %llu\n", k, s[k]); } initxorshift1024star(s); printf("Outputs:\n"); for (k = 0; k < 32; ++k) { printf("%2d %llu\n", k, xorshift1024star()); } return 0; }