OberonCore https://forum.oberoncore.ru/ |
|
Генерация случайных чисел https://forum.oberoncore.ru/viewtopic.php?f=23&t=1680 |
Страница 1 из 2 |
Автор: | Alexey Veselovsky [ Понедельник, 29 Июнь, 2009 12:42 ] |
Заголовок сообщения: | Генерация случайных чисел |
Модератор: ответ на сообщение viewtopic.php?p=31078#p31078. Тема обсуждения изменилась и выделена. Конечно плохо. Вот например сегодня с утреца решил я посмотреть как будет работать реализация алгоритма quick sort на CP. Реализацию алгоритма нашел на этом форуме (две реализации: одна от info21 (не рабочая -- просто не компилируется), другая от Ярослав Романченко -- рабочая), однако прежде чем сортировать, нужно контейнер (в данном случае массив) чем-то заполнить. Желательно случайными числами. В результате я где-то на протяжении часа искал чем же в BB сгенерить случайное число. Гугл не помог. Дока тоже не помогла (на самом деле помогла бы если бы по умолчанию оно искало бы регистеронезависимо, или я бы додумался поставить галку "Ignore case"). На форуме нашел таки упоминание про модуль ObxRandom. Нашел его в доке. Открываю... И вижу буквально вот это: Код: MODULE ObxRandom; (** project = "BlackBox" organization = "www.oberon.ch" contributors = "Oberon microsystems" version = "System/Rsrc/About" references = "Martin Reiser, Niklaus Wirth, Programming In Oberon, ISBN 0201565439" changes = "" issues = "" **) VAR z: INTEGER; (* global variable *) PROCEDURE Uniform* (): REAL; CONST a = 16807; m = 2147483647; q = m DIV a; r = m MOD a; VAR gamma: INTEGER; BEGIN gamma := a * (z MOD q) - r * (z DIV q); IF gamma > 0 THEN z := gamma ELSE z := gamma + m END; RETURN z * (1.0 / m) (* value of the function *) END Uniform; PROCEDURE InitSeed* (seed: INTEGER); BEGIN z := seed END InitSeed; BEGIN z := 314159 (* initial value of seed *) END ObxRandom. Что возвращает функция? В каких диапазонах будет лежать значение... Да, а самое смешное, поскольку у меня был массив INTEGER'ов, то пришлось присваивать значения вот так: Код: Arr[i]:= SHORT(ENTIER(ObxRandom.Uniform())); Т.е. в процессе исполнения имеем забавные превращения: INTEGER->REAL->LONGINT->INTEGER Или есть какой-то более кошерный способ генерации псевдослучайных целых чисел в BB? (про обероны не говорю, ибо общей какой-то библиотеки, или хотя бы общей вики по библиотекам просто нет). |
Автор: | Евгений Темиргалеев [ Понедельник, 29 Июнь, 2009 15:16 ] |
Заголовок сообщения: | Re: Google Code Search не знает об Оберонах |
Странные непонятки. Alexey Veselovsky писал(а): Дока тоже не помогла Alexey Veselovsky писал(а): (на самом деле помогла бы если бы по умолчанию оно искало бы регистеронезависимо, или я бы додумался поставить галку "Ignore case"). Итого: дока не причём.Alexey Veselovsky писал(а): Что возвращает функция? В каких диапазонах будет лежать значение... Даже судя по названию, REAL от 0 до 1. Ещё есть исх. код + ссылка на литературу "Martin Reiser, Niklaus Wirth, Programming In Oberon, ISBN 0201565439".Alexey Veselovsky писал(а): Да, а самое смешное, поскольку у меня был массив INTEGER'ов, то пришлось присваивать значения вот так: Дружно смеёмся над:Код: Arr[i]:= SHORT(ENTIER(ObxRandom.Uniform())); Language Report писал(а): Assignment compatible... 5. Tv is a numeric type and e is a constant expression whose value is contained in Tv;... 6.1 Basic Types... Types 4 to 7 are integer types, types 8 and 9 are real types, and together they are called numeric types. They form a hierarchy; the larger type includes (the values of) the smaller type: REAL >= SHORTREAL >= LONGINT >= INTEGER >= SHORTINT >= BYTE Alexey Veselovsky писал(а): Т.е. в процессе исполнения имеем забавные превращения: INTEGER->REAL->LONGINT->INTEGER Если Вас эти преобразования не устраивают (хотя не понятно, какая разница для "посмотреть как будет работать реализация алгоритма quick sort на CP" какие там идут преобразования) -- перед Вами исходный код Uniform, где целое z отображается на вещественное [0,1]. Скопируйте и сделайте свою целочисленную функцию z MOD сколькоНадо.
Или есть какой-то более кошерный способ генерации псевдослучайных целых чисел в BB? |
Автор: | Sergo [ Понедельник, 29 Июнь, 2009 15:38 ] |
Заголовок сообщения: | Re: Google Code Search не знает об Оберонах |
Alexey Veselovsky писал(а): ...Или есть какой-то более кошерный способ генерации псевдослучайных целых чисел в BB? (про обероны не говорю, ибо общей какой-то библиотеки, или хотя бы общей вики по библиотекам просто нет). Для ВВ есть неплохая математическая библиотека - Epse21. В модуле Random там целый набор генераторов. Компилируется по крайней мере нормально:) Скачать можно тут: http://www.zinnamturm.eu/downloadsDH.htm#Epse21 На Oberon-2 я использую такой модуль (взят с небольшими переделками из исходников Oo2c) Код: MODULE RandomNumbers;
(** Детали алгоритма см. в Park S.K. and Miller K.W. (1988) "Random number generators, good ones are hard to find". Communications of the ACM, 31, 1192-1201. *) CONST modulo* = 2147483647; (* =2^31-1 *) VAR z* : LONGINT; (** Инициализация генератора целым числом: *) PROCEDURE PutSeed*(seed: LONGINT); BEGIN seed := seed MOD modulo; IF (seed = 0) THEN z := 1 ELSE z := seed END END PutSeed; PROCEDURE NextRND; CONST a = 16807; q = 127773; (* m div a *) r = 2836; (* m mod a *) VAR lo, hi, test: LONGINT; BEGIN hi := z DIV q; lo := z MOD q; test := a * lo - r * hi; IF (test > 0) THEN z := test ELSE z := test + modulo END END NextRND; (** Целые случайные числа в диапазоне 0 <= x < range. Range должен быть в интервале 1 .. 2^31-2 *) PROCEDURE RND*(range : LONGINT): LONGINT; BEGIN NextRND; RETURN z MOD range END RND; (** Вещественные случайные числа в диапазоне 0.0 <= x < 1.0 *) PROCEDURE Random*(): REAL; BEGIN NextRND; RETURN (z-1)*(1 / (modulo-1)) END Random; BEGIN z := 314053 END RandomNumbers. |
Автор: | Alexey Veselovsky [ Понедельник, 29 Июнь, 2009 16:15 ] |
Заголовок сообщения: | Re: Google Code Search не знает об Оберонах |
Цитата: Итого: дока не причём. Итого дока как раз причем. Просто в силу неправильного умолчательного значения флажка. Я его, честно говоря, и не заметил. Полнотекстовый поиск обычно делается нечувствительным к регистру, если пользователем не указано обратное. Везде. И это логично. Random или random с т.з. естественного языка -- одно и тоже, слово одно и то же, обозначает одно и то же, просто в одном случае оно находится в начале предложения, а в другом нет, как например в этом предложении. Цитата: Даже судя по названию, REAL от 0 до 1. Ещё есть исх. код + ссылка на литературу "Martin Reiser, Niklaus Wirth, Programming In Oberon, ISBN 0201565439". А что там с названием? Функция: Однообразно(), или Единообразно(). Возвращает вещественный тип. Имеет какое-то отношение к случайным числам. Откуда я должен придумать какой диапазон оно выдаст? Нет, я конечно предположил что от 0 до 1, и основываясь на этом предположении построил алгоритм. Но это же не верно! На базовые функции должна быть документация. Генератор случайных чисел -- базовая функциональность. Документация должна быть как краткой (вот вам функция, получает то-то выдает то-то), так и подробная включая харакетристики сгенерированых значений. + ссылки на первоисточники. Тут имеем только ссылку на первоисточник + некий невнятный исходник. Мне не интересна реализация! Мне интересна СПЕЦИФИКАЦИЯ модуля! Где, черт возьми, воспеваемая оберонами модульность? Где сокрытие частностей от пользователя модуля? Почему для того чтобы понять как пользоваться модулем я обязан ковыряться в его потрохах? С ISBN 0201565439 ещё интересней. Т.е. чтобы написать простейший тест, вы предлагаете мне сходить в библиотеку и попробовать взять эту книжку? Или спиратить её откуда-нибудь с сети? Цитата: Дружно смеёмся над: Language Report писал(а): Assignment compatible... 5. Tv is a numeric type and e is a constant expression whose value is contained in Tv;... 6.1 Basic Types... Types 4 to 7 are integer types, types 8 and 9 are real types, and together they are called numeric types. They form a hierarchy; the larger type includes (the values of) the smaller type: REAL >= SHORTREAL >= LONGINT >= INTEGER >= SHORTINT >= BYTE И? У нас есть массив содержащий переменный типа INTEGER. ENTIER возвращает переменную типа LONGINT. Код: ENTIER(x) real type LONGINT largest integer not greater than x Arr[i] := ENTIER(r); -- очевидная ошибка компиляции. Т.о. полученый из ENTIER результат требуется привести к типу INTEGER. Посему и получаем замечательную строчку вида: Код: Arr[i]:= SHORT(ENTIER(ObxRandom.Uniform())); Действительно, смешно. Цитата: Если Вас эти преобразования не устраивают (хотя не понятно, какая разница для "посмотреть как будет работать реализация алгоритма quick sort на CP" какие там идут преобразования) -- Насчет преобразований типов -- просто покоробило когда писал. Неприятно. Цитата: перед Вами исходный код Uniform, где целое z отображается на вещественное [0,1]. Скопируйте и сделайте свою целочисленную функцию z MOD сколькоНадо. Совет в лучших традициях мейнстримового опенсорса, где фиговую архитектуру и документацию пытаются прикрыть или хотя бы морально оправдать доступностью исходников. |
Автор: | Info21 [ Понедельник, 29 Июнь, 2009 17:00 ] |
Заголовок сообщения: | Re: Генерация случайных чисел |
Alexey Veselovsky писал(а): quick sort на CP. Реализацию алгоритма нашел на этом форуме (две реализации: одна от info21 (не рабочая -- просто не компилируется) Это где такая??
|
Автор: | Alexey Veselovsky [ Понедельник, 29 Июнь, 2009 17:04 ] |
Заголовок сообщения: | Re: Генерация случайных чисел |
Info21 писал(а): Alexey Veselovsky писал(а): quick sort на CP. Реализацию алгоритма нашел на этом форуме (две реализации: одна от info21 (не рабочая -- просто не компилируется) Это где такая??Вот вроде: viewtopic.php?f=7&t=1264&p=22323&hilit=quicksort#p22323 |
Автор: | Alexey Veselovsky [ Понедельник, 29 Июнь, 2009 17:06 ] |
Заголовок сообщения: | Re: Генерация случайных чисел |
Alexey Veselovsky писал(а): Info21 писал(а): Alexey Veselovsky писал(а): quick sort на CP. Реализацию алгоритма нашел на этом форуме (две реализации: одна от info21 (не рабочая -- просто не компилируется) Это где такая??Вот вроде: viewtopic.php?f=7&t=1264&p=22323&hilit=quicksort#p22323 Хотя, посмотрел вверх по форуму, похоже это не ваш вариант а Trurl'я. А может и ещё кого, надо читать полностью ту тему. Извиняюсь. Смотрел по диагонали то что выдал поиск по форуму. |
Автор: | Евгений Темиргалеев [ Понедельник, 29 Июнь, 2009 17:07 ] |
Заголовок сообщения: | Re: Google Code Search не знает об Оберонах |
* Alexey Veselovsky: "решил я посмотреть как будет работать реализация алгоритма quick sort на CP. Реализацию алгоритма нашел на этом форуме ... от Ярослав Романченко -- рабочая". * ObxRandom -- пример, взятый из указанной книги. Не базовый модуль... * На поиск ObxRandom уважаемый Alexey Veselovsky потратил много времени из-за невнимательности: "Я его, честно говоря, и не заметил." (Ignore Case) Вложение: ic.PNG [ 1.98 КБ | Просмотров: 14929 ] Решил попробовать... работает...претензии... ![]() P.S. Решать какая функциональность базовая, а какая нет, надо скорее разработчикам, либо постоянным пользователям. Но никак не решившим что-то посмотреть. По-моему разумению базовая -- часто используемая. |
Автор: | Alexey Veselovsky [ Понедельник, 29 Июнь, 2009 17:17 ] |
Заголовок сообщения: | Re: Генерация случайных чисел |
Повторяю -- это была иллюстрация к теме "Google Code Search не знает об Оберонах" (viewtopic.php?f=27&t=1679). Аналогичные действия для С++ не вызвали никаких проблем вообще (но это понятно, С++ я знаю), для поиска этой функциональности для Haskell-я, которого я вообще не знаю, я затратил минуту (google), на BB пришлось затратить час. Ещё вопросы? А генерация псевдослучайных чисел всё же базовая функциональность. Ну, либо на BB решаются какие-то сильно иные задачи нежели на C/C++/Haskell/Java/Ada/Lisp/Delphi/etc. |
Автор: | Valery Solovey [ Понедельник, 29 Июнь, 2009 17:41 ] |
Заголовок сообщения: | Re: Генерация случайных чисел |
И всё-таки, базовое - это основопологающее, а не частоиспользуемое (хотя одно другому не мешает). Разработчики ББ выделили определённую нишу для своего продукта, и там необходимость в случайных числах отсутствует, поэтому этот модуль на роль базового не особо претендует. Какая у ББ ниша? Бизнесс-приложения. Редкий экземпляр этого класса ПО не работает с БД, поэтому, отсутствие поддержки БД было бы, как минимум странным. Модуль работы с БД может служить примером базового модуля ББ. |
Автор: | Valery Solovey [ Понедельник, 29 Июнь, 2009 17:55 ] |
Заголовок сообщения: | Re: Генерация случайных чисел |
Alexey Veselovsky писал(а): ... Во-первых, это в винде поиск по умолчанию нечувствителен к регистру.Во-вторых, насколько я знаю, подсистема Obx - это примеры исходных кодов. То есть, в данной подсистеме исходник и есть самое главное. Просто Вам предлагается использовать его не совсем подходящим способом: скомпилировать и использовать : ). В третьих, поиск в ББ и вправду не радует. Провозглашается отход от модальности и удаляются модальные окна, от которых проблем меньше, чем от режимов, устанавливаемых всякими флажками и радиокнопками. Мне, вроде, этот флажок никогда проблем не создавал, но каждый раз, когда я открываю поиск, вижу его, у меня возникает вопрос: "Почему?". Почему бы ни быть последовательным и удалить режим и отсюда? Почему бы ни сделать две кнопки: "Поиск с учётом регистра" и "Поиск без учёта регистра"? |
Автор: | Alexey Veselovsky [ Понедельник, 29 Июнь, 2009 17:57 ] |
Заголовок сообщения: | Re: Генерация случайных чисел |
Valery Solovey писал(а): И всё-таки, базовое - это основопологающее, а не частоиспользуемое (хотя одно другому не мешает). Разработчики ББ выделили определённую нишу для своего продукта, и там необходимость в случайных числах отсутствует, поэтому этот модуль на роль базового не особо претендует. Какая у ББ ниша? Бизнесс-приложения. Редкий экземпляр этого класса ПО не работает с БД, поэтому, отсутствие поддержки БД было бы, как минимум странным. Модуль работы с БД может служить примером базового модуля ББ. ОК. Бизнес приложение. Хорошо. Делаем клиент-серверное нечто. При создании нового юзверя ему должен быть автоматически сгенерирован достаточно стойкий пароль (т.е. не Qwerty12). Как это сделать без генератора псевдослучайных чисел? |
Автор: | Valery Solovey [ Понедельник, 29 Июнь, 2009 18:17 ] |
Заголовок сообщения: | Re: Генерация случайных чисел |
А причём здесь пользователи? На бирже ценных бумаг несколько раз в секунду в БД добавляются данные об изменениях цен. Требуется вести статистику и, возможно, принимать некоторые решения (фильтры о дальнейшем слежении за теми или иными бумагами и т.д.). Сеть магазинов для своевременного заполнения полок своих филиалов (из большого центрального склада - так дешевле) должна опираться на статистику продаж. Если клиенты пользуются при оплате пластиковыми картами, то можно вести статистику предпочтений держателя карты или назначения постоянного дисконта. И т.д. Можно, конечно, вывести доступ к бизнесс-данным в глобальную сеть, и тогда станут необходимыми дополнительные расходы на безопасность. Изначально это не бизнес-проблемы. |
Автор: | Alexey Veselovsky [ Понедельник, 29 Июнь, 2009 18:44 ] |
Заголовок сообщения: | Re: Генерация случайных чисел |
Банальная система документооборота в конторе -- более чем бизнес приложение. У каждого служащего свой логин и пароль. Онлайн магазин -- логин и пароль у каждого пользователя. Или ещё банальней -- обычный сервер irc -- у пользователей также имеются логины и пароли. И неплохо бы их генерировать автоматически. В криптографии вроде как тоже случайные числа используются. Да даже какой-нибудь банальный тетрис без генератора случайных чисел не сделать. Какой-нибудь скринсейвер со звездочками. Полно задач (в т.ч. бизнес приложений) где требуется генератор случайных чисел. То что вам не приходилось с этим сталкиваться -- ещё ни о чем не говорит. PS. Кстати, а в каких таких "бизнес приложениях" замечено использование BB? |
Автор: | Евгений Темиргалеев [ Понедельник, 29 Июнь, 2009 18:55 ] |
Заголовок сообщения: | Re: Генерация случайных чисел |
В конце концов --- какая разница, часто используется генератор псеводслучайных чисел или нет? В ББ он есть, самому писать не надо. Ну а что нет стандартного описания процедуры, а только ссылка на книгу "Programming in Oberon. M. Reiser and N. Wirth" - это другой вопрос. И опять же, возможности использовать процедуру он не препятствует. Только требует несколько лишних минут на разбирательство кода процедуры. |
Автор: | Александр Ильин [ Понедельник, 29 Июнь, 2009 19:43 ] |
Заголовок сообщения: | Re: Генерация случайных чисел |
Alexey Veselovsky писал(а): Да даже какой-нибудь банальный тетрис без генератора случайных чисел не сделать. Легко. Системный таймер есть, нажатия клавиш пользователем есть. Небольшой хэш - и готово.
|
Автор: | Alexey Veselovsky [ Понедельник, 29 Июнь, 2009 20:30 ] |
Заголовок сообщения: | Re: Генерация случайных чисел |
Александр Ильин писал(а): Alexey Veselovsky писал(а): Да даже какой-нибудь банальный тетрис без генератора случайных чисел не сделать. Легко. Системный таймер есть, нажатия клавиш пользователем есть. Небольшой хэш - и готово.В результате вместо нормального генератора псевдослучайных чисел накарябали свой собственный велосипед с квадратными колёсами на котором последовательность нормально не воспроизвести. |
Автор: | Евгений Темиргалеев [ Понедельник, 29 Июнь, 2009 20:38 ] |
Заголовок сообщения: | Re: Генерация случайных чисел |
Александр Ильин писал(а): Alexey Veselovsky писал(а): Да даже какой-нибудь банальный тетрис без генератора случайных чисел не сделать. Легко. Системный таймер есть, нажатия клавиш пользователем есть. Небольшой хэш - и готово.P.S. Несколько строчек кода ObxRandom - простого и понятного, а сколько информационного шума... Каюсь: тут причиной моя несдержанность ![]() |
Автор: | Alexey Veselovsky [ Понедельник, 29 Июнь, 2009 20:49 ] |
Заголовок сообщения: | Re: Генерация случайных чисел |
Евгений Темиргалеев писал(а): Александр Ильин писал(а): Alexey Veselovsky писал(а): Да даже какой-нибудь банальный тетрис без генератора случайных чисел не сделать. Легко. Системный таймер есть, нажатия клавиш пользователем есть. Небольшой хэш - и готово.Эмм.. А какие ещё варианты то возможны? ![]() Не, ну можно конечно заказать разработку кому-то ещё ![]() Но проще и правильней всего когда генератор случайных чисел входит в стандартную библиотеку языка. По кр. мере с т.з. прикладного программирования. Иначе легко получить индусский код ![]() |
Автор: | Info21 [ Понедельник, 29 Июнь, 2009 22:03 ] |
Заголовок сообщения: | Re: Генерация случайных чисел |
Alexey Veselovsky писал(а): Но проще и правильней всего когда генератор случайных чисел входит в стандартную библиотеку языка. По кр. мере с т.з. прикладного программирования. Не очевидно отнюдь. С гсч так нагреться можно, что ... в общем, не очевидно.
|
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |