Почему моя математика не добавляется в мой LCG?

Например, здесь: http://www.math.cornell.edu/~mec/Winter2009/Luo/Linear%20Congruential%20Generator/linear%20congruential%20gen1.html

Я пытаюсь реализовать LCG для примера набора проблем, но он не работает для меня, и я не могу понять, почему?

Уравнение является прямым: Xn+1 =(aXn + c) mod m

Из приведенной выше ссылки: Например, последовательность, полученная, когда X0 = a = c = 7, m = 10, составляет 7, 6, 9, 0, 7, 6, 9, 0, ...

Реализация этого в Java, например -

public static void lcg(){

    int a = 7;
    int c = 7;
    int m = 10;
    int x0 = 7;
    int N = 10;

    for (int x = x0; x < x0+N; x++){

        int result = (a*x + c) % m;

        System.out.println(result);

    }

Я получаю вывод: 6 3 0 7 4 1 8 5 2 9

Вместо ожидаемых 7,6,9,0,...

Я получаю то же самое на бумаге. Кто-нибудь может понять, что идет не так?

Аналогично, a=10, c=7, m=11, x0 = 3 должны давать повторяющуюся последовательность 4,3,4,3, но я получаю 4 3 2 1 0 10 9 8 7 6

1 ответ

Решение

Кажется, это просто неправильное понимание итерации. Это не проблема с уравнением, но то, что вы делаете с результатом уравнения.

Я читаю Xn+1 = (aXn + c) mod m как

Следующее значение x будет текущим значениемxплюс cмод m".

Обратите внимание на мой акцент. Вы выбрасываете текущее значение x (result), затем просто используя "переменную счетчика итераций" в уравнении на следующей итерации.

Измените цикл на

for (int x = x0, i = 0; i < 5; i++) {
    // Note x is being updated instead
    x = (a*x + c) % m;

    System.out.print(x);
}

69076
Другие вопросы по тегам