Add pareto distribution randomizer
[fio.git] / lib / zipf.c
index 34f28772682dba677a7da5d6d18a23fec57e0ed0..28e8d77e5602d13b95e73e561ce4df418750d441 100644 (file)
@@ -126,3 +126,21 @@ unsigned long long zipf_next(struct zipf_state *zs)
 
        return val - 1;
 }
+
+void pareto_init(struct zipf_state *zs, unsigned long nranges, double h)
+{
+       memset(zs, 0, sizeof(*zs));
+
+       zs->nranges = nranges;
+       zs->pareto_pow = log(h) / log(1.0 - h);
+
+       init_rand(&zs->rand);
+}
+
+unsigned long long pareto_next(struct zipf_state *zs)
+{
+       double rand = (double) __rand(&zs->rand) / (double) FRAND_MAX;
+       unsigned long long n = zs->nranges - 1;
+
+       return n * pow(rand, zs->pareto_pow);
+}