From f6c322249f00ce1bd1709b346aa616f2f4f7abd6 Mon Sep 17 00:00:00 2001 From: Tobias Date: Tue, 10 Oct 2017 20:26:06 -0700 Subject: [PATCH] Add Linear Congruential Generator --- Misc/LinearCongruentialGenerator.java | 57 +++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 Misc/LinearCongruentialGenerator.java diff --git a/Misc/LinearCongruentialGenerator.java b/Misc/LinearCongruentialGenerator.java new file mode 100644 index 00000000..b03c10da --- /dev/null +++ b/Misc/LinearCongruentialGenerator.java @@ -0,0 +1,57 @@ +/*** + * A pseudorandom number generator. + * + * @author Tobias Carryer + * Date: October 10, 2017 + */ +public class LinearCongruentialGenerator { + + private double a, c, m, previousValue; + + /*** + * These parameters are saved and used when nextNumber() is called. + * The current timestamp in milliseconds is used as the seed. + * + * @param multiplier + * @param increment + * @param modulo The maximum number that can be generated (exclusive). A common value is 2^32. + */ + public LinearCongruentialGenerator( double multiplier, double increment, double modulo ) { + this(System.currentTimeMillis(), multiplier, increment, modulo); + } + + /*** + * These parameters are saved and used when nextNumber() is called. + * + * @param seed + * @param multiplier + * @param increment + * @param modulo The maximum number that can be generated (exclusive). A common value is 2^32. + */ + public LinearCongruentialGenerator( double seed, double multiplier, double increment, double modulo ) { + this.previousValue = seed; + this.a = multiplier; + this.c = increment; + this.m = modulo; + } + + /** + * The smallest number that can be generated is zero. + * The largest number that can be generated is modulo-1. modulo is set in the constructor. + * @return a pseudorandom number. + */ + public double nextNumber() { + previousValue = (a * previousValue + c) % m; + return previousValue; + } + + public static void main( String[] args ) { + // Show the LCG in action. + // Decisive proof that the LCG works could be made by adding each number + // generated to a Set while checking for duplicates. + LinearCongruentialGenerator lcg = new LinearCongruentialGenerator(1664525, 1013904223, Math.pow(2.0, 32.0)); + for( int i = 0; i < 512; i++ ) { + System.out.println(lcg.nextNumber()); + } + } +}