Switch to using our internal Tausworthe based random generator for offsets

It's both faster and more exhaustive than what is available on
glibc on my test systems. So no downsides, and the upside of having
the same offset generator across all platforms.

This will change the random series, so could alter performance for
your workload since the pattern will be different in sequence. There's
an option to revert to the OS generator, you can add use_us_rand=1
on your job files to retain the old generator offsets.

Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
diff --git a/lib/rand.c b/lib/rand.c
index 0681282..3b2d67a 100644
--- a/lib/rand.c
+++ b/lib/rand.c
@@ -43,20 +43,28 @@
 	return (x < m) ? x + m : x;
 }
 
+static void __init_rand(struct frand_state *state, unsigned int seed)
+{
+	int cranks = 6;
+
+#define LCG(x, seed)  ((x) * 69069 ^ (seed))
+
+	state->s1 = __seed(LCG((2^31) + (2^17) + (2^7), seed), 1);
+	state->s2 = __seed(LCG(state->s1, seed), 7);
+	state->s3 = __seed(LCG(state->s2, seed), 15);
+
+	while (cranks--)
+		__rand(state);
+}
+
 void init_rand(struct frand_state *state)
 {
-#define LCG(x)  ((x) * 69069)   /* super-duper LCG */
+	__init_rand(state, 1);
+}
 
-	state->s1 = __seed(LCG((2^31) + (2^17) + (2^7)), 1);
-	state->s2 = __seed(LCG(state->s1), 7);
-	state->s3 = __seed(LCG(state->s2), 15);
-
-	__rand(state);
-	__rand(state);
-	__rand(state);
-	__rand(state);
-	__rand(state);
-	__rand(state);
+void init_rand_seed(struct frand_state *state, unsigned int seed)
+{
+	__init_rand(state, seed);
 }
 
 void __fill_random_buf(void *buf, unsigned int len, unsigned long seed)