return 0;
r = __rand(&gs->r);
- vr = gs->stddev * (r / (FRAND_MAX + 1.0));
+ vr = gs->stddev * (r / (FRAND32_MAX + 1.0));
return vr - gs->stddev / 2;
}
sum += dev;
}
- return __hash_u64(sum) % gs->nranges;
+ if (!gs->disable_hash)
+ sum = __hash_u64(sum);
+
+ return sum % gs->nranges;
}
-void gauss_init(struct gauss_state *gs, unsigned long nranges, unsigned int d,
+void gauss_init(struct gauss_state *gs, unsigned long nranges, double dev,
unsigned int seed)
{
memset(gs, 0, sizeof(*gs));
- init_rand_seed(&gs->r, seed);
+ init_rand_seed(&gs->r, seed, 0);
gs->nranges = nranges;
- if (d) {
- gs->stddev = (nranges * 100) / d;
+
+ if (dev != 0.0) {
+ gs->stddev = ceil((double) (nranges * 100.0) / dev);
if (gs->stddev > nranges / 2)
gs->stddev = nranges / 2;
}
}
+
+void gauss_disable_hash(struct gauss_state *gs)
+{
+ gs->disable_hash = true;
+}