IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> определение отрзека апериодичности, генераторы ПСЧ
сообщение
Сообщение #1


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


надо мне в работу это вставить, нашел теорию, вот набрасал код, но понять никак не могу все ли я верно сделал, и вообще алгоритм какой-то странный на мой взгляд, слишком много лишних движений...Но по заданию надо использовать именно его.

вот теория: 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;
}


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Я не знаю, каким компилятором ты пользовался, но у тебя возможна проблема вот тут:

  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) тоже лишнее, но это уже мелочи, компилятор в принципе способен привести типы корректно...

За исключением проблемы с циклами - вроде бы все по алгоритму...

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Спасибо за комментарии. smile.gif


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


такой вопрос у меня ...

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 ... и что это за цифра ?! Какую полезную информацию о датчике мы можем получить зная ее ? Мне кажется что-то не то я нахожу ....


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Цитата
Какую полезную информацию о датчике мы можем получить зная ее ?
Ну, например:

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

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 24.12.2024 0:28
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name