псевдослучайныЕ последовательностИ, мечта о нескольких Randomize |
псевдослучайныЕ последовательностИ, мечта о нескольких Randomize |
Lapp |
Сообщение
#1
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Допустим, мне нужно несколько самостоятельных параллельных линий, использующих случайные числа. Как известно, для отладки желательно не отрабатывать процедуру Randomize - тогда мы имеем повторяемость последовательности случайных чисел, выдаваемых функцией Random. "Сбить" такую последовательность можно, например, пропуском нескольких чисел. Вопрос же состоит в следующем: могу ли я (в отладочных целях или еще по какой причине) получить в одном процессе повторяемую последовательность, а в другом - нет?
-------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
volvo |
Сообщение
#2
|
Гость |
Можешь попробовать. Исходники функции Random найти проще простого - они лежат в \fpc-2.2.4.source\fpc-2.2.4\rtl\inc\system.inc (у меня исходники для предыдущей версии, лень перекачивать, не так уж много там и изменилось), подкорректируй эту функцию так, чтобы она использовала не одну и ту же переменную RandSeed, а несколько (для каждой необходимой тебе "линии" - своя "затравка").
Кстати, "линия" - это ты о чем? Если о потоках - то вот это: Embarcadero QC -> #4368 может быть тебе интересно. Тут фактически готовое решение. |
Lapp |
Сообщение
#3
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
подкорректируй эту функцию так, чтобы она использовала не одну и ту же переменную RandSeed, а несколько (для каждой необходимой тебе "линии" - своя "затравка"). Да, это выход. Спасибо.Цитата Кстати, "линия" - это ты о чем? Я сознательно неясно выразился, потому что пока сам не знаю, как оно будет реализоываться. Постановка самой задачи только еще оформляется, код еще не начат. Более того, даже с платформой не определились.. )) И последний штрих: кодить буду не я.. )) Просто пытаюсь отследить возможные подводные камни.Цитата Если о потоках - то вот это: Embarcadero QC -> #4368 может быть тебе интересно. Тут фактически готовое решение. о, ну это ваще блеск )). Сиб!-------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Dypexia |
Сообщение
#4
|
Гость |
Допустим random действительно генерит дискретную последовательность по равномерному закону распределения, тогда у меня возникает другой вопрос: Как из этого равномерного распределения сделать другое распределение?
Или как в Delphi сгенерить дискретную последовательность с не стандартным распределениемне стандартную имею в виду, что даже в MATLAB таких распределений не делается автоматом. |
Lapp |
Сообщение
#5
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Допустим random действительно генерит дискретную последовательность по равномерному закону распределения, тогда у меня возникает другой вопрос: Как из этого равномерного распределения сделать другое распределение? Дркгое - это какое? Можно налажить веса, если надо..Цитата Или как в Delphi сгенерить дискретную последовательность с не стандартным распределениемне стандартную имею в виду, что даже в MATLAB таких распределений не делается автоматом. Выразись поточнее. Чего "не делает даже MATLAB автоматом" - это как-то не очень понятно..-------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
andriano |
Сообщение
#6
|
Гуру Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: 28 |
Редко захожу на форум, поэтому своевременно не видел эту тему.
В Паскале есть внутренняя переменная randseed, которая доступна извне. Достаточно в каждой "линии" завести по одной переменной для хранения текущего значения randseed, чтобы в каждой из них фактически оказывался независимый от других "линий" ГПСЧ. 1. Сохраняем значение randseed во временную переменную. 2. Помещаем в randseed значение из нашей дополнительной переменной для текущей линии. 3. Вызываем random. 4. Возвращаем в дополнительную переменную значение randseed. 5. Восстанавливаем значение randseed из временной переменной. Все. Для других вызовов random этот вызов прошел незамеченным. И, кроме того, в нем самом последовательность не зависит от вызовов из других мест. Сообщение отредактировано: andriano - |
Текстовая версия | 23.12.2024 22:39 |