zt+1 = (dx2t + axt + c) mod N, t = 0,1,2…
Характеристики (x0, a, c, d, N) Є V4N × N квадратичной конгруэнтной последовательности
Кубический конгруэнтный метод. Последовательность случайных чисел вычисляется с помощью следующего рекуррентного соотношения
Xi+1=(ax3+ax2+ax+d)mod m
Для практических расчетов принимают m=2k, k=14,15,31
1. #include <iostream>
2. using namespace std;
3. double congruential(int &); // прототип функции генерации псевдослучайных чисел
4. int main(int argc, char* argv[])
5. {
6. const int number_numbers = 25; // количество псевдослучайных чисел
7. int x0 = 2; // начальное значение (выбирается случайно 0 <= x0 < m)
8. cout << "\npseudo-random numbers: ";
9. for (int i = 0; i <= number_numbers; i++)
10. cout << congruential(x0) << " "; // генерация i-го числа
11. cout << "\n";
12. system("pause");
13. return 0;
14. }
15. double congruential(int &x) // функция генерации псевдослучайных чисел
16. {
17. const int m = 100, // генерация псевдослучайных чисел в диапазоне значений от 0 до 100 выбирается случайно m > 0)
18. a = 8, // множитель (выбирается случайно 0 <= a <= m)
19. inc = 65; // инкрементирующее значение (выбирается случайно 0 <= inc <= m)
20. x = ((a * x) + inc) % m; // формула линейного конгруэнтного метода генерации псевдослучайных чисел
21. return (x / double(m));
22. }