![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
Jill |
![]() ![]()
Сообщение
#1
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 105 Пол: Женский Реальное имя: Юлия Репутация: ![]() ![]() ![]() |
Не посылайте в FAQ, плз. Я там была. Конкретно по этой теме там пару слов
![]() Только начала разбираться, и уже появилось несколько камней преткновения. Условие. Необходимо создать СМО с ожиданием из 10 элементов, где: - время прибытия и время обслуживания - случайные числа с нормальным распределением (просто random не подходит) - остальные компоненты просчитываются, но об этом позже - соблюдается принцип очереди FIFO в динамике Код (это не все, только то, что вызывает вопросы): type Вопросы: 1. Во всех алгоритмах норм.распределения генерируемые числа - вещественные, а мне необходимы целые. Плюс - числа должны быть >=0. Как грамотно их преобразовать? 2. В первой колонке сформированых чисел, по-моему, должен быть порядок - этот пришел в 0-ой момент времени, этот в 1-ый и т.д. Во второй - упорядочивание не должно проводиться. Как разобраться с этим? 3. Во второй колонке не должен попадаться 0 (время обслуживания не может быть таковым). Достаточно ли просто прибавить 1? И самый главный вопрос. После прогона получаются ОДИНАКОВЫЕ наборы чисел! Мне необходимо отразить результаты нескольких прогонов, а какой с них толк, если они одинаковые! Помогите разобраться ![]() Сообщение отредактировано: volvo - 3.11.2006 19:55 |
Бродяжник |
![]()
Сообщение
#2
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 206 Пол: Мужской Репутация: ![]() ![]() ![]() |
Если идет речь о нормально распределенных случайных числах, то они ведь распределены на каком-то интервале, верно?
Итак, имеем Fi - очередное сгенерированное Вашей функцией вещественное случайное число. Видимо, оно будет в интервале от 0 до 1? Или, в общем случае, от F1 до F2. TPi - очередное время прибытия. Тоже, надо полагать в некотором интервале - от TP1 до ТP2. TOi - очередное время обслуживания. В некотором интервале - от TО1 до ТО2. Тогда Код TPi := TP1 + (TP2-TP1)*(Fi-F1)/(F2-F1); TOi := TO1 + (TO2-TO1)*(Fi-F1)/(F2-F1); Если Fi лежит в интервале от 0 до 1, тогда формулы упрощаются. Код TPi := TP1 + (TP2-TP1)*Fi; TOi := TO1 + (TO2-TO1)*Fi; Если нужны именно целые числа (integer), то результат вычислений округляем (TPi := round(...)). По поводу наборов чисел. Поскольку Ваша функция случайных чисел использует стандартный random, то перед каждым прогоном один раз вызываем процедуру randomize - и будет счастье. |
Jill |
![]()
Сообщение
#3
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 105 Пол: Женский Реальное имя: Юлия Репутация: ![]() ![]() ![]() |
Так, с этим разобралась
![]() ![]() Кст, отдельное спасибо за randomize - вылетело из головы ![]() Тут другой вопрос возник. Динамика. Что-то я с ней никак подружиться не могу ![]() Как грамотно при закрытии проги уничтожать очередь, чтоб мусора не оставалось? Сообщение отредактировано: Jill - 27.07.2006 11:36 |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Цитата(Jill @ 26.07.2006 15:23) Как грамотно при закрытии проги уничтожать очередь, чтоб мусора не оставалось? Наверное, так:procedure Clear; |
Jill |
![]()
Сообщение
#5
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 105 Пол: Женский Реальное имя: Юлия Репутация: ![]() ![]() ![]() |
Ок, с мусором разобрались. Спасибо
![]() Тут еще вопрос возник. Переписала процедуру построения очереди - мне кажется, предыдущая версия (вставка элементов в упорядоченный список) была мухляжом ![]() Так честнее: procedure Queure; Суть вопроса. По-моему, я ошиблась в условии - работа системы ограничена во времени, а не по количеству требований. Получается, система должна работать 10 единиц времени (без учета задержки из-за последнего требования). То бишь, до момента, когда node^.t1=10. Как организовать этот цикл? По-моему, repeat в динамике нельзя использовать...? ![]() И еще один глупый вопрос (не ругайте, мне и так стыдно ![]() Сообщение отредактировано: volvo - 3.11.2006 19:56 |
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
Цитата(Jill @ 28.07.2006 13:13) По-моему, repeat в динамике нельзя использовать...? ![]() ![]() while naf do begin Цитата(Jill @ 28.07.2006 13:13) Как прервать работу программы при зацикливании? В смысле, как программно определить зацикливание и выйти из цикла, или у тебя запущенная программа зациклилась, и ты хочешь прервать ее работу?P.S. Цитата(Jill @ 28.07.2006 13:13) Так честнее: Еще честнее было бы не бегать все время по очереди, а сделать в TClient ссылку не только на Next, но и на Prev... ![]() |
Jill |
![]()
Сообщение
#7
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 105 Пол: Женский Реальное имя: Юлия Репутация: ![]() ![]() ![]() |
Цитата Это почему? В смысле, почему ты думаешь, что Repeat нельзя, а While - можно? Понятия не имею... Один препод (не по этому предмету...фух ![]() Цитата В смысле, как программно определить зацикливание и выйти из цикла, или у тебя запущенная программа зациклилась, и ты хочешь прервать ее работу? Второе - какими кнопками прервать ![]() Цитата Еще честнее было бы не бегать все время по очереди, а сделать в TClient ссылку не только на Next, но и на Prev... volvo, это больной вопрос ![]() |
volvo |
![]()
Сообщение
#8
|
Гость ![]() |
Цитата(Jill @ 28.07.2006 13:59) Это не так, да? Не так, конечно... Применять или нет Repeat/Until программист должен НЕ там, где используются (или не используются) динамические переменные, а там, где это удобно...Цитата(Jill @ 28.07.2006 13:59) Второе - какими кнопками прервать Иногда помогает Ctrl+Break, но это срабатывает в Турбо-Паскале 7.0 далеко не всегда, а только во время выполнения операций ввода/вывода... В остальное время вряд ли у тебя получится что-то сделать...Цитата(Jill @ 28.07.2006 13:59) volvo, это больной вопрос Если ты готова пожертвовать 4-мя байтами памяти на каждый элемент очереди, чтобы было проще (и быстрее, насколько я понимаю) работать с этой самой очередью, то добавь ссылку на предыдущий элемент. Если программа критична к использованию памяти, а скорость ее работы менее важна - то этого делать не стОит... А ошибаться не бойся: "Не ошибается только тот, кто ничего не делает" (С)![]() |
Jill |
![]()
Сообщение
#9
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 105 Пол: Женский Реальное имя: Юлия Репутация: ![]() ![]() ![]() |
Еще вопрос. По поводу вывода требований и течения смоделированного времени +это самое время, правда поединично надо тоже выводить (0,1,2,3,.....10)
Вывод списка требований производится с задержкой, если предыдущий и текущий элемент отличаются: if (pred<>NIL)and(pred^.t1<>curr^.t1) then Delay(1000); Как обработать данные, чтобы, например, если элементы отличаются на 2 - единицы времени - задержка вывода списка - в два раза больше {с этим вроде разобралась...}, а вывод текущего времени - продолжается? {а вот с этим - нет ![]() Надеюсь, не слишком запутанно... Сообщение отредактировано: volvo - 3.11.2006 19:57 |
![]() ![]() |
![]() |
Текстовая версия | 20.07.2025 13:50 |