Проникающая гидроизоляция бетона
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Прочее. Программное обеспечение > Генератор случайных чисел на Lisp

Генератор случайных чисел на Lisp

Ответ
Поиск в этой теме
Непрочитано 10.08.2006, 18:17 #1
Генератор случайных чисел на Lisp
Cleper
 
проектирование систем безопасности
 
г. Иваново
Регистрация: 08.08.2006
Сообщений: 30

Кто нибудь может поделиться генератором случайных чисел написанным на Lisp-е.
А то я что-то недоганая в методе Парка-Миллера
Просмотров: 10392
 
Непрочитано 10.08.2006, 21:44
#2
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 721


Может я прогулял лекцию по математике или информатике, когда изучали принцип действия генератора.
И у меня тоже возникает вопрос, а как получается случайная величина? Вроде в точных науках случайностей не бывает -- все подлежит какойлибо закономерности.

Как вообще рождаются случайности.
mmax вне форума  
 
Непрочитано 10.08.2006, 21:46
#3
AY

webcad.pro
 
Регистрация: 06.01.2005
Московская обл.
Сообщений: 501


Если речь идет об Autolisp то не следует забывать, что функция генерации псевдо случайных чисел присутствует в популярной библиотеке doslib.
AY вне форума  
 
Непрочитано 10.08.2006, 22:50
#4
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 721


А всетаки.
Как получить случайную величину?
Порылся в учебниках и узнал, что случайная величина зависит от вероятности испытания и там вообще черт ногу сломит.

Остается предложить пользователю бросить кости, купить лотерейный билет или сходить в казино.
mmax вне форума  
 
Непрочитано 10.08.2006, 23:56
#5
AY

webcad.pro
 
Регистрация: 06.01.2005
Московская обл.
Сообщений: 501


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

Если я наврал - пусть меня поправят сведущие люди.
AY вне форума  
 
Непрочитано 11.08.2006, 10:17
#6
Rost

Инженер-Архитектор
 
Регистрация: 20.03.2005
Сообщений: 777


Давно пора знать что случайно ничего не бывает, разве только ....... ГСЧ это понятие весьма относительное, или условное.
Да и все что связано с компьютерами, чертовски логично.
Rost вне форума  
 
Непрочитано 11.08.2006, 11:58
#7
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 10,860


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

Практически же используются псевдослучайные числа. Да еще и ограничиваются диапазоном. Реализации зависят от системы программирования. Например, в Pascal перед вызовом функции Random обязательно надо запускать процедуру инициализации Randomise, иначе генератор случайного числа будет всегда выдавать один и тот же результат. А процедура randomise основана на системном таймере, поэтому результаты будут случайными с приемлемыми для практики значениями.

В AutoLISP генератора нет. Для "нашего" круга задач он и не нужен. Обычно идея со случайными числами появляется не ради самих чисел, а ради вторичного эффекта - например, получения "уникальных" имен и т.п. Это решается просто и без случайных чисел. Если же "очень надо", можно реализовать учебные алгоритмы или обратиться к системным функциям через COM.

Созданием собственных генераторов на разных языках еще мучают студентов в учебных целях. Мучение студентов - основное назначение генераторов.
ShaggyDoc вне форума  
 
Непрочитано 11.08.2006, 13:42
#8
Rost

Инженер-Архитектор
 
Регистрация: 20.03.2005
Сообщений: 777


ГСЧ активно используют инет-казино. Есть куча форумов где обсуждают параметры ГСЧ в тех или иных казино. Такчто весч давольно востребованная.
Rost вне форума  
 
Непрочитано 11.08.2006, 14:28
#9
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 10,860


В любых казино используются такие ГСЧ, что совершенно случайно в выигрыше всегда заведение. Естественно, такие генераторы востребованы.
ShaggyDoc вне форума  
 
Непрочитано 11.08.2006, 16:30
#10
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 721


Я когдато хотел использовать ГСЧ для создания уникальных имен, но нашел способ лучше -- например

Код:
[Выделить все]
;------------------------------------------------------------------------------------
;если блок с именем "blknam" существует то к имени нашего блока добавляется еще "blknam"
;и так до тех пор пока имя блока не станет уникальным
  (setq blkname "blknam")
  (while (tblobjname "block" blkname) (setq blkname (strcat blkname "blknam")))
;------------------------------------------------------------------------------------
В такой ситуации можно смело называть блоки распространенными именами (unitaz, vanna, otmetka, bolt....) не опасаясь, что такой блок существует.

А вот сделать функцию, чтобы она возвращала 8 с такойже вероятностью как 1562, нет идей для алгоритма.

хотя я пробовал запускать длительные процессы по нескольку раз с регистрацией времени, то время завершения различалось с разбросом в 1-3 секунды.

Вот например подходящая функция для этого дела

Код:
[Выделить все]
;Возвращает список-последовательность чисел разных типов
(defun num-lst-alltypes (vlax-vbtypes index1 index2 start step  / i n sf) 
(setq sf (vlax-make-safearray vlax-vbtypes (cons index1 index2)))
(setq i 0)
(setq n (- start step))
(repeat index2 (vlax-safearray-put-element sf (setq i (1+ i)) (setq n (+ step n))))
(vlax-safearray->list sf)
)
;пример
;(num-lst-alltypes vlax-vbdouble 1 10 1 1)
;возвращает
;(1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0)
;Index1 должен быть равным 1. Начальный элемент формируется аргументом start
;можно vlax-vbstring
На моем компьютере список от 1 до 2000000 без вывода на экран формируется за 29-33 секунды, 100000ные элементы получаются почти мгновенно с одинаковым временем.

Промежуток времени(в данной ситуации) -- и есть случайное число, но зависящее от конфигурации компьютера. более мощный компьютер может скушать и 30млн за считанные секунды и промежуток времени при каждом испытании будет одинаковый. Такой генератор будет ненадежным и будет работать только на вашем компьютере так как работает за счет превышения нагрузки на оборудование и может вызвать зависание и наврядли вам захочется ждать результата свыше 10 секунд.

Еще можно просто прочитать переменную CDATE и обработать ее, например умножить на какоенибудь число. Получится случайное число, но если вы сегодня запустили процесс в 13:00 то завтра в 13:00 это значение будет
(= сегодня (1+ завтра)); если обрабатывалась дата
, а если дата не обрабатывалась то и вовсе
(= сегодня завтра)
-- вероятность 100%.
Но уже более надежный повод для размышлений.
mmax вне форума  
 
Непрочитано 11.08.2006, 16:49
#11
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,210


Когда-то мне тоже понадобился ГСЧ в лиспе.

Идею до полной отладки так и не довел, но общий смысл был примерно в следующем (похоже на идею mmax):

Дизелем взять из системного таймера милилсекунды. Взять две последние значащие цифры миллисекунд и умножить их на какое-либо иррациональное число (на худой конец на пи), а потом округлить до требуемой точности.

Получалось не слишком хорошо (многовато одинаковых значений), но кое-что получалось.
Pilot вне форума  
 
Непрочитано 11.08.2006, 17:39
#12
Zouss


 
Регистрация: 14.03.2006
Сообщений: 863


Цитата:
Q: дано N, как получить числа от 0 до N - 1 в случайном порядке, но так, чтобы они не повторялись.

A: Следующая формула задаёт (рекуррентно) псевдослучайную последовательность чисел от 0 до N - 1:
x(n+1) = (a * x(n) + c) % N, где a взаимно просто с N.

Чтобы получить последовательность, нужно как-либо инициализировать первой значение x(0) — с значением rand() % N, или, например, текущим значением времени. Потом, при каждой новой итерации будет выдаваться новое, уникальное число от 0 до N - 1, и ровно через N раз повторится начальное значение, после чего все числа в точности повторятся, и т. д.

Это будет так для любого a, взаимно простого с N (например, a = 333 и N = 1000), и для любого c (c — это просто произвольный сдвиг, может быть нулевым).

Это самый простой генератор случайных чисел; он называется линейным конгруентным генератором. За подробностями отсылаю читать второй том Кнута.
или

http://eusi.narod.ru/lib/savgorodnij/9.3.4.html
Zouss вне форума  
 
Непрочитано 11.08.2006, 20:43
#13
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 721


попробовал поисследовать CDATE

20060811.18381562

последняя цифра изменяет свое значение от 0 до 9 (если я правильно мыслю) десять раз в секунду а предпоследняя 1 раз в секунду.

И чтобы получить нужное число определенной длинны, то надо прочитать переменную столько раз чтобы получилось это число.

например нужно число в 5 знаков

(getvarcdate->string) -- например это функция читающая CDATE и преобразующая последнюю цифру в строку и возвращает эту строку

(repeat 5 (setq i (strcat (getvarcdate->string) i )))

Вот вам самый реальный генератор с нормальной вероятностью.

Если нужно число из диапазона, то воизбежание проблем с вероятностью надо сделать цикл который будет делать число до тех пор пока это число не попадет в диапазон. И не забывайте о бесконечных циклах -- в данной ситуации цикл будет выполняться за определенную единицу времени а эта единица может оказаться равной изменению CDATE и каждый раз получать одно и тоже число.

вобщем незабудьте подсчитать все вероятности.
mmax вне форума  
 
Непрочитано 12.08.2006, 13:36
#14
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 721


Код:
[Выделить все]
(defun gsch (len_int /
		     getdate i
		     )

  (defun getdate (/ cdatt strdatt strdatt endchislo)
  
    
  (setq cdatt (getvar "cdate"))
  (setq strdatt (rtos cdatt 2 8))
  (setq endchislo (substr strdatt 17 1))
    (if (eq endchislo "") (setq endchislo "0") (princ))
        endchislo
    );(getdate)

  (while (eq (setq i (getdate)) "0"))
    (repeat (1- len_int) (progn (mdelay 50)(setq i (strcat i (getdate)))))
  ;(atoi i)  
  ) ;(gsch 20)
Ввиду того что функция выполняется мгновенно и возвращает однои тоже число.
пришлось включить в нее ARX - приложение стороннего автора.

для того чтобы генератор работал надо загрузить ARX - приложение из архива.
там есть функция (mdelay) которая делает задержки.
или надо сделать самим какойнибудь тормоз вместо нее.

данный ГСЧ:
возвращает число-строку
аргумент -- количество знаков в строке, должен быть целым числом
никогда не возвратит подобное "33333333333333"
первое число не может начинаться на ноль
если аргумент больше 10, то в возвращаемом значении можно заметить повторение одних и тех же групп чисел,но это не влияет на уникальность числа.
[ATTACH]1155375409.rar[/ATTACH]
mmax вне форума  
 
Непрочитано 12.08.2006, 14:05
#15
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,239
Отправить сообщение для Александр Ривилис с помощью Skype™


1) Лучше бы сослался на сайт, где этот arx находится, т.к. он там есть под разные версии AutoCAD
2) Насколько я помню функция задержки есть в DOSLIB - все-таки это более стандартный arx
3) В качестве задержки можно использовать и пустой (почти пустой) цикл - правда он будет сильнее загружать процессор.
Александр Ривилис вне форума  
 
Непрочитано 12.08.2006, 18:12
#16
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 721


Приношу свои извинения автору.

http://www.maestrogroup.com.ua/support/ProgressBars.zip
Автор Александр Ривилис
В этом приложении находится необходимая функция (mdelay), а также индикаторы прогресса.
mmax вне форума  
 
Непрочитано 12.08.2006, 18:48
#17
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,440
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от Александр Ривилис
1) Лучше бы сослался на сайт, где этот arx находится, т.к. он там есть под разные версии AutoCAD
2) Насколько я помню функция задержки есть в DOSLIB - все-таки это более стандартный arx
3) В качестве задержки можно использовать и пустой (почти пустой) цикл - правда он будет сильнее загружать процессор.
Хотелось бы добавить, есть еще встроенные в автокад средства, позволяющие делать задержку...
Код:
[Выделить все]
(acet-sys-sleep msec); используется "Express Tools"
(command "_.delay" msec); стандартная команда
Елпанов Евгений вне форума  
 
Непрочитано 12.08.2006, 20:49
#18
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,210


А если сделать так:

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

Теперь:
- лиспом через команду shell или любым другим способом запускается на исполнение внешний ГСЧ.
- ГСЧ генерирует псевдослучайное число и записывает его в файл или в общесистемную переменную и завершает свою работу.
- лисп считывает псевдослучайное число и использует для себя.

Вуаля?

Правда, получается, что сам ГСЧ не на лиспе написан.
Тогда вопрос: тут важен конечный результат или сам факт написания ГСЧ на лиспе?
Pilot вне форума  
 
Непрочитано 12.08.2006, 21:02
#19
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,239
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от mmax
Приношу свои извинения автору.
Я, похоже, напросился. Речь ведь шла не об авторских правах (исходник этого arx-файла на CD к книге Н.Н. Полещука: http://www.private.peterlink.ru/pole...6/Razr2006.htm), а о возможности использования его с разными версиями AutoCAD.
Александр Ривилис вне форума  
 
Непрочитано 13.08.2006, 11:11
#20
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 721


Стандартные средства это хорошо.

В моем генераторе не все так уж и хорошо
Если обратить внимание, то можно заметить некоторые закономерности:

все полученные числа начинающиеся на одно и тоже число будут почти а иногда одинаковыми

Длинные числа, свыше 10 знаков, будут иметь такой вид

"156823695156823695"

Но если сделать значение для (mdelay) случайным да еще чтобы при кждом повторе в цикле оно было разным и незакономерным, то получится уже более реальный генератор.
mmax вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Прочее. Программное обеспечение > Генератор случайных чисел на Lisp

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск