Помощь - Поиск - Пользователи - Календарь
Полная версия: определение отрзека апериодичности
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
klem4
надо мне в работу это вставить, нашел теорию, вот набрасал код, но понять никак не могу все ли я верно сделал, и вообще алгоритм какой-то странный на мой взгляд, слишком много лишних движений...Но по заданию надо использовать именно его.

вот теория: 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;
}
volvo
Я не знаю, каким компилятором ты пользовался, но у тебя возможна проблема вот тут:

  for (unsigned long i = 1; i < N; i++)
out_file << i << ": " << cmrand(&prior, i) << endl;

double LAST = cmrand(&prior, i); // <--- Начиная отсюда



Почему? Потому, что:
Цитата(Стандарт (6.5.3))
If the for-init-statement is a declaration, the scope of the name(s) declared extends to the end of the for statement.
То есть, после выхода из цикла For значение i не определено, и может не равняться N, как ты этого ожидаешь...

Ну, и присваивание double в unsigned long (я про N) тоже лишнее, но это уже мелочи, компилятор в принципе способен привести типы корректно...

За исключением проблемы с циклами - вроде бы все по алгоритму...
klem4
Спасибо за комментарии. smile.gif
klem4
такой вопрос у меня ...

4-й пункт - поиск L

Что собственно говоря это L из себя представляет ? Не могу понять ...

скажем при

const double A  = 0.92;
const double C = 0.5;
const double x0 = 0.16;
const int k = 1;
const unsigned long N = 100000;


L = 390 ... и что это за цифра ?! Какую полезную информацию о датчике мы можем получить зная ее ? Мне кажется что-то не то я нахожу ....
volvo
Цитата
Какую полезную информацию о датчике мы можем получить зная ее ?
Ну, например:

Цитата(Нагуглено где-то...)
- Длина отрезка апериодичности псевдослучайной последовательности означает, что все числа в пределах отрезка апериодичности не повторяются. Очевидно, что использование при моделировании систем последовательности чисел, длина которой больше отрезка апериодичности L, может привести к повторению испытаний, что не дает новых статистических данных.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.