unsigned long long zipf_next(struct zipf_state *zs) { double alpha, eta, rand_uni, rand_z; unsigned long long n = zs->nranges; unsigned long long val; alpha = 1.0 / (1.0 - zs->theta); eta = (1.0 - pow(2.0 / n, 1.0 - zs->theta)) / (1.0 - zs->zeta2 / zs->zetan); rand_uni = (double) __rand(&zs->rand) / (double) FRAND32_MAX; rand_z = rand_uni * zs->zetan; if (rand_z < 1.0) val = 1; else if (rand_z < (1.0 + pow(0.5, zs->theta))) val = 2; else val = 1 + (unsigned long long)(n * pow(eta*rand_uni - eta + 1.0, alpha)); val--; if (!zs->disable_hash) val = __hash_u64(val); return (val + zs->rand_off) % zs->nranges; }
unsigned long long pareto_next(struct zipf_state *zs) { double rand = (double) __rand(&zs->rand) / (double) FRAND32_MAX; unsigned long long n; n = (zs->nranges - 1) * pow(rand, zs->pareto_pow); if (!zs->disable_hash) n = __hash_u64(n); return (n + zs->rand_off) % zs->nranges; }
unsigned long long gauss_next(struct gauss_state *gs) { unsigned long long sum = 0; int i; for (i = 0; i < GAUSS_ITERS; i++) sum += __rand(&gs->r) % (gs->nranges + 1); sum = (sum + GAUSS_ITERS - 1) / GAUSS_ITERS; if (gs->stddev) { int dev = gauss_dev(gs); while (dev + sum >= gs->nranges) dev /= 2; sum += dev; } return __hash_u64(sum) % gs->nranges; }