вот теория: http://fmi.asf.ru/library/book/SimModel/Glava2.HTML
реализация ():
# include <iostream.h>
# include <fstream.h>
# include <math.h>
// параметры для конгруэнтного-мультипликативного генератора
const double A = 713;
const double C = 78;
const double x0 = 399;
const int k = 700;
// количество чисел
const unsigned long N = 1E+5;
// КМ генератор ПСЧ
double cmrand(double *prior, unsigned long i) {
double rnd = i == 1 ? x0 : fmod((A * (*prior) + C), k);
*prior = rnd;
return rnd;
}
int main(void) {
double prior;
ofstream out_file;
out_file.open("out_file.txt", ios :: trunc);
// далее идем по алгоритму ...
// генерим N - 1 чисел
for (unsigned long i = 1; i < N; i++)
out_file << i << ": " << cmrand(&prior, i) << endl;
double LAST = cmrand(&prior, i); // запоминаем последнее значение X[N]
out_file << i++ << ": " << LAST << endl;
for (; (i <= 2 * N) && !(cmrand(&prior, i) == LAST); i++); // генерим числа дальше пока не получим значение равное запомненному
if (i > 2 * N) cout << "T > 2 * N, L > 2 * N - 1"; // не нашли ...
else {
// значение найдено идем дальше
unsigned long i_1 = i++; // запоминаем i_1, увеличиваем i
// продолжаем генерить числа пока не найдем следующее найденное запомненному последнему
for (; !(cmrand(&prior, i) == LAST); i++);
// выводим всю лабуду на экран
cout << "\nLAST = " << LAST << endl;
unsigned long T = i - i_1;
cout << "i_1 = " << i_1 << endl;
cout << "i_2 = " << i << endl;
// переходим к последнему пункту - поиску L
double T_prior;
for (int j = 1; j <= T; j++) cmrand(&T_prior, j);
for (i = 1; !(cmrand(&prior, i) == cmrand(&T_prior, T + i - 1)); i++);
// генерим значения сначала, пока не получим x[i] = x[T + i - 1]
unsigned long L = T + i - 1;
cout << "T = " << T << ", L = " << L << endl;
}
out_file.close();
cout << "\ndone";
return 0;
}