package de.hsma;

public class MorrisCounter {
    public static int x = 0;
    public static int c = 0;

    public static void main(String[] args) {
        // 8191 = 2^13 - 1, 16383 = 2^14 - 1
        // z.B., 8bit: 13 -> 0000 1101, 14 -> 0000 1110
        int total = 1000 * 10;
        for (int i = 0; i < total; i++) {
            count();
        }
    }

    public static void count() {
        c++;
        // momentane Abschätzung
        double v = Math.pow(2, x);
        double r = Math.random();

        // Zufallszahl aus Bereich: 0 bis 2^x (d.h. wir inkrementieren mit einer Wahrscheinlichkeit von 1/2^x)
        double inc = r * v;
        if (inc <= 1) {
            x++;
        }

        System.out.println(c + ": " + (int) (Math.pow(2, x) - 1) +
                "; x = " + x + "; error = " + Math.abs(1 - (Math.pow(2, x) - 1) / c));
    }
}

