--- /dev/null
+/**
+ * Author: Mark Larkin
+ *
+ * Copyright (c) 2007 Des Higgins, Julie Thompson and Toby Gibson.
+ */
+#ifdef HAVE_CONFIG_H
+ #include "config.h"
+#endif
+#include "RandomGenerator.h"
+
+namespace clustalw
+{
+
+/**
+ * The contructor initialises the random algorithm.
+ * @param s
+ * @return
+ */
+RandomGenerator::RandomGenerator(unsigned long s)
+ : m(100000000), m1(10000)
+{
+ a[0] = s;
+ j = 0;
+ do
+ {
+ ++j;
+ a[j] = (mult(31, a[j - 1]) + 1) % m;
+ }
+ while (j < 54);
+}
+
+/**
+ * additive congruential method.
+ * @param r
+ * @return unsigned long random number in the range 0 to r-1
+ */
+unsigned long RandomGenerator::addRand(unsigned long r)
+{
+ int x, y;
+ j = (j + 1) % 55;
+ x = (j + 23) % 55;
+ y = (j + 54) % 55;
+ a[j] = (a[x] + a[y]) % m;
+
+ return (((a[j] / m1) *r) / m1);
+}
+
+/**
+ *
+ * @param p
+ * @param q
+ * @return
+ */
+unsigned long RandomGenerator::mult(unsigned long p, unsigned long q)
+{
+ unsigned long p1, p0, q1, q0;
+
+ p1 = p / m1;
+ p0 = p % m1;
+ q1 = q / m1;
+ q0 = q % m1;
+ return ((((p0 *q1 + p1 * q0) % m1) *m1 + p0 * q0) % m);
+}
+
+}