![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
klem4 |
![]()
Сообщение
#1
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
надо мне в работу это вставить, нашел теорию, вот набрасал код, но понять никак не могу все ли я верно сделал, и вообще алгоритм какой-то странный на мой взгляд, слишком много лишних движений...Но по заданию надо использовать именно его.
вот теория: 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";'
|
volvo |
![]()
Сообщение
#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 - 18.09.2007 19:03 |
klem4 |
![]()
Сообщение
#3
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
Спасибо за комментарии.
![]() -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
klem4 |
![]()
Сообщение
#4
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
такой вопрос у меня ...
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";'
|
volvo |
![]()
Сообщение
#5
|
Гость ![]() |
Цитата Какую полезную информацию о датчике мы можем получить зная ее ? Ну, например:Цитата(Нагуглено где-то...) - Длина отрезка апериодичности псевдослучайной последовательности означает, что все числа в пределах отрезка апериодичности не повторяются. Очевидно, что использование при моделировании систем последовательности чисел, длина которой больше отрезка апериодичности L, может привести к повторению испытаний, что не дает новых статистических данных. |
![]() ![]() |
![]() |
Текстовая версия | 29.07.2025 10:40 |