summaryrefslogtreecommitdiff
path: root/randnum.c
diff options
context:
space:
mode:
Diffstat (limited to 'randnum.c')
-rw-r--r--randnum.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/randnum.c b/randnum.c
new file mode 100644
index 0000000..7d2620f
--- /dev/null
+++ b/randnum.c
@@ -0,0 +1,55 @@
+#include <stdint.h>
+#include <math.h>
+
+/****************************
+** RANDOM NUMBER GENERATOR **
+*****************************
+** This is a second-order linear congruential random number
+** generator. Its advantage is (of course) that it can be
+** seeded and will thus produce repeatable sequences of
+** random numbers.
+*/
+
+/****************************
+* randnum() *
+*****************************
+** Second order linear congruential generator.
+** Constants suggested by J. G. Skellam.
+** If val==0, returns next member of sequence.
+** val!=0, restart generator.
+*/
+
+int32_t randnum(int32_t val) {
+ static int32_t randw[2] = { 13 , 117 };
+ int32_t interm;
+
+ if (val != 0) {
+ randw[0] = 13;
+ randw[1] = 117;
+ }
+
+ interm = (randw[0]* (int32_t)254754 + randw[1]*(int32_t)529562) % (int32_t)999563;
+ randw[1] = randw[0];
+ randw[0] = interm;
+ return(interm);
+}
+
+/****************************
+* randwc() *
+*****************************
+** Returns signed 32-bit random modulo num.
+*/
+int32_t randwc(int32_t num) {
+ return(randnum(0) % num);
+}
+
+/***************************
+** abs_randwc() **
+****************************
+** Same as randwc(), only this routine returns only
+** positive numbers.
+*/
+uint32_t abs_randwc(uint32_t num) {
+ return abs(randwc(num));
+}
+