--- /dev/null
+/*
+ * Fast multiple pseudorandom number states functions
+ * This can be useful where performance is critical and repeating low quality
+ * pseudorandom numbers are acceptable or even sought for.
+ *
+ * Copyright (c) 2017, Matthew Mondor
+ * ALL RIGHTS RESERVED.
+ */
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include <fastrandom.h>
+
+/*
+ * Initializes specified random state.
+ * Returns 0, or EINVAL if parameters are invalid, ENOMEM if allocation fails.
+ * <state> fr_state_t object pointer to initialize.
+ * <seed> unsigned integer used to initialize random state using srand(3).
+ * <entries> amount of individual pseudorandom numbers in state table.
+ * <min>, <max> allowed random number range.
+ */
+int
+fr_init(fr_state_t *state, unsigned int seed, int entries, long min, long max)
+{
+ long *ptr = NULL;
+
+ if (entries < 1 || min < 0 || max > RAND_MAX || min >= max)
+ return EINVAL;
+
+ if ((state->fr_start = malloc(sizeof(long) * entries)) == NULL)
+ return ENOMEM;
+
+ state->fr_cur = state->fr_start;
+ state->fr_end = &state->fr_start[entries];
+
+ srandom(seed);
+ for (ptr = state->fr_start, max; ptr < state->fr_end; ptr++)
+ *ptr = min + (random() % (max - min + 1));
+
+ return 0;
+}
+
+/*
+ * Returns a pseudorandom number using <state>.
+ * <state> must have previously been initialized once using fr_init().
+ */
+inline long
+fr_random(fr_state_t *state)
+{
+ register long res;
+
+ res = *state->fr_cur++;
+ if (state->fr_cur == state->fr_end)
+ state->fr_cur = state->fr_start;
+
+ return res;
+}
--- /dev/null
+/*
+ * Fast multiple pseudorandom number states functions
+ * Copyright (c) 2017, Matthew Mondor
+ * ALL RIGHTS RESERVED.
+ */
+
+#ifndef _FASTRANDOM_H_
+#define _FASTRANDOM_H_
+
+typedef struct fr_state {
+ long *fr_start, *fr_end, *fr_cur;
+} fr_state_t;
+
+extern int fr_init(fr_state_t *, unsigned int, int, long, long);
+inline extern long fr_random(fr_state_t *);
+
+#endif
--- /dev/null
+#include <stdlib.h>
+#include <stdio.h>
+#include <time.h>
+
+#include <fastrandom.h>
+
+int main(void);
+
+static fr_state_t frs;
+
+int
+main(void)
+{
+ int i;
+ long min = 0, max = 15;
+
+ if (fr_init(&frs, (unsigned int)time(NULL), 16, min, max) != 0)
+ exit(EXIT_FAILURE);
+
+ for (i = 0, max = -RAND_MAX, min = RAND_MAX; i < 32; i++) {
+ long r;
+
+ r = fr_random(&frs);
+ if (r < min)
+ min = r;
+ if (r > max)
+ max = r;
+ (void) printf("%ld\n", r);
+ }
+ (void) printf("min: %ld, max: %ld\n", min, max);
+
+ exit(EXIT_SUCCESS);
+}