|
||
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны | Справка по форуму | Файлообменник | |
|
Поиск в этой теме |
10.08.2006, 18:17 | #1 | |
Генератор случайных чисел на Lisp
проектирование систем безопасности
г. Иваново
Регистрация: 08.08.2006
Сообщений: 30
|
||
Просмотров: 13680
|
|
||||
Программист широкого профиля. Регистрация: 08.09.2005
Челябинск
Сообщений: 722
|
Может я прогулял лекцию по математике или информатике, когда изучали принцип действия генератора.
И у меня тоже возникает вопрос, а как получается случайная величина? Вроде в точных науках случайностей не бывает -- все подлежит какойлибо закономерности. Как вообще рождаются случайности. |
|||
|
||||
Программист широкого профиля. Регистрация: 08.09.2005
Челябинск
Сообщений: 722
|
А всетаки.
Как получить случайную величину? Порылся в учебниках и узнал, что случайная величина зависит от вероятности испытания и там вообще черт ногу сломит. Остается предложить пользователю бросить кости, купить лотерейный билет или сходить в казино. |
|||
|
||||
webcad.pro Регистрация: 06.01.2005
Московская обл.
Сообщений: 501
|
Последовательности генерируемые компьютером от того и называются псевдослучайными, что при ближайшем рссмотрении не так уж и случайны. Вот, например, радиактивный распад по утверждению физиков - другое дело. Впрочем для обчных случаев компютерной случайности вполне достаточно...
Если я наврал - пусть меня поправят сведущие люди. |
|||
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381
|
Получение абсолютно случайных чисел - задача не решенная. Но очень необходимая в некоторых научных приложениях.
Практически же используются псевдослучайные числа. Да еще и ограничиваются диапазоном. Реализации зависят от системы программирования. Например, в Pascal перед вызовом функции Random обязательно надо запускать процедуру инициализации Randomise, иначе генератор случайного числа будет всегда выдавать один и тот же результат. А процедура randomise основана на системном таймере, поэтому результаты будут случайными с приемлемыми для практики значениями. В AutoLISP генератора нет. Для "нашего" круга задач он и не нужен. Обычно идея со случайными числами появляется не ради самих чисел, а ради вторичного эффекта - например, получения "уникальных" имен и т.п. Это решается просто и без случайных чисел. Если же "очень надо", можно реализовать учебные алгоритмы или обратиться к системным функциям через COM. Созданием собственных генераторов на разных языках еще мучают студентов в учебных целях. Мучение студентов - основное назначение генераторов. |
|||
|
||||
Программист широкого профиля. Регистрация: 08.09.2005
Челябинск
Сообщений: 722
|
Я когдато хотел использовать ГСЧ для создания уникальных имен, но нашел способ лучше -- например
Код:
А вот сделать функцию, чтобы она возвращала 8 с такойже вероятностью как 1562, нет идей для алгоритма. хотя я пробовал запускать длительные процессы по нескольку раз с регистрацией времени, то время завершения различалось с разбросом в 1-3 секунды. Вот например подходящая функция для этого дела Код:
Промежуток времени(в данной ситуации) -- и есть случайное число, но зависящее от конфигурации компьютера. более мощный компьютер может скушать и 30млн за считанные секунды и промежуток времени при каждом испытании будет одинаковый. Такой генератор будет ненадежным и будет работать только на вашем компьютере так как работает за счет превышения нагрузки на оборудование и может вызвать зависание и наврядли вам захочется ждать результата свыше 10 секунд. Еще можно просто прочитать переменную CDATE и обработать ее, например умножить на какоенибудь число. Получится случайное число, но если вы сегодня запустили процесс в 13:00 то завтра в 13:00 это значение будет (= сегодня (1+ завтра)); если обрабатывалась дата , а если дата не обрабатывалась то и вовсе (= сегодня завтра) -- вероятность 100%. Но уже более надежный повод для размышлений. |
|||
|
||||
Проектировщик свиноводство Регистрация: 21.08.2003
Сообщений: 2,260
|
Когда-то мне тоже понадобился ГСЧ в лиспе.
Идею до полной отладки так и не довел, но общий смысл был примерно в следующем (похоже на идею mmax): Дизелем взять из системного таймера милилсекунды. Взять две последние значащие цифры миллисекунд и умножить их на какое-либо иррациональное число (на худой конец на пи), а потом округлить до требуемой точности. Получалось не слишком хорошо (многовато одинаковых значений), но кое-что получалось. |
|||
|
||||
Регистрация: 14.03.2006
Сообщений: 863
|
Цитата:
http://eusi.narod.ru/lib/savgorodnij/9.3.4.html |
|||
|
||||
Программист широкого профиля. Регистрация: 08.09.2005
Челябинск
Сообщений: 722
|
попробовал поисследовать CDATE
20060811.18381562 последняя цифра изменяет свое значение от 0 до 9 (если я правильно мыслю) десять раз в секунду а предпоследняя 1 раз в секунду. И чтобы получить нужное число определенной длинны, то надо прочитать переменную столько раз чтобы получилось это число. например нужно число в 5 знаков (getvarcdate->string) -- например это функция читающая CDATE и преобразующая последнюю цифру в строку и возвращает эту строку (repeat 5 (setq i (strcat (getvarcdate->string) i ))) Вот вам самый реальный генератор с нормальной вероятностью. Если нужно число из диапазона, то воизбежание проблем с вероятностью надо сделать цикл который будет делать число до тех пор пока это число не попадет в диапазон. И не забывайте о бесконечных циклах -- в данной ситуации цикл будет выполняться за определенную единицу времени а эта единица может оказаться равной изменению CDATE и каждый раз получать одно и тоже число. вобщем незабудьте подсчитать все вероятности. |
|||
|
||||
Программист широкого профиля. Регистрация: 08.09.2005
Челябинск
Сообщений: 722
|
Код:
пришлось включить в нее ARX - приложение стороннего автора. для того чтобы генератор работал надо загрузить ARX - приложение из архива. там есть функция (mdelay) которая делает задержки. или надо сделать самим какойнибудь тормоз вместо нее. данный ГСЧ: возвращает число-строку аргумент -- количество знаков в строке, должен быть целым числом никогда не возвратит подобное "33333333333333" первое число не может начинаться на ноль если аргумент больше 10, то в возвращаемом значении можно заметить повторение одних и тех же групп чисел,но это не влияет на уникальность числа. [ATTACH]1155375409.rar[/ATTACH] |
|||
|
||||
1) Лучше бы сослался на сайт, где этот arx находится, т.к. он там есть под разные версии AutoCAD
2) Насколько я помню функция задержки есть в DOSLIB - все-таки это более стандартный arx 3) В качестве задержки можно использовать и пустой (почти пустой) цикл - правда он будет сильнее загружать процессор. |
||||
|
||||
Программист широкого профиля. Регистрация: 08.09.2005
Челябинск
Сообщений: 722
|
Приношу свои извинения автору.
http://www.maestrogroup.com.ua/support/ProgressBars.zip Автор Александр Ривилис В этом приложении находится необходимая функция (mdelay), а также индикаторы прогресса. |
|||
|
||||
Цитата:
Код:
|
||||
|
||||
Проектировщик свиноводство Регистрация: 21.08.2003
Сообщений: 2,260
|
А если сделать так:
Написать внешний ГСЧ на любом доступном и удобном для этого языке программирования и скомпилировать в ехе-шник. Теперь: - лиспом через команду shell или любым другим способом запускается на исполнение внешний ГСЧ. - ГСЧ генерирует псевдослучайное число и записывает его в файл или в общесистемную переменную и завершает свою работу. - лисп считывает псевдослучайное число и использует для себя. Вуаля? Правда, получается, что сам ГСЧ не на лиспе написан. Тогда вопрос: тут важен конечный результат или сам факт написания ГСЧ на лиспе? |
|||
|
||||
Цитата:
|
||||
|
||||
Программист широкого профиля. Регистрация: 08.09.2005
Челябинск
Сообщений: 722
|
Стандартные средства это хорошо.
В моем генераторе не все так уж и хорошо Если обратить внимание, то можно заметить некоторые закономерности: все полученные числа начинающиеся на одно и тоже число будут почти а иногда одинаковыми Длинные числа, свыше 10 знаков, будут иметь такой вид "156823695156823695" Но если сделать значение для (mdelay) случайным да еще чтобы при кждом повторе в цикле оно было разным и незакономерным, то получится уже более реальный генератор. |
|||