Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Fortran > [General] Random numbers in F77 |
Автор: valvliv 2.3.2006, 17:52 |
Тут нужно нагенерить случайных чисел, а код на 77-м фортране, поэтому функцию из 90-го не вплетешь. Я посмотрела в сети - кто только как не предлагает, и каждый код - по странице (причем не всегда компеляемый). Есть ли у кого опыт в этом деле, чтобы просто и понятно?? Л. |
Автор: Cr@$h 2.3.2006, 19:35 | ||||||
Лично я доверяю процедуре из книги Форсайта "Машинные методы математических вычислений". Вот код процедуры на F66 (77?).
Я её, конечно, переписал под F95:
Примерчик по использованию последней:
Процедура заточена на генерацию числа за числом. Но её можно модифицировать и для возвращения случайного массива. Наверное, эта процедура тоже очень надуманная, но, тем не менее, обладает хорошими статистическими характеристиками. Могу ещё написать, если что-то не понравится. ![]() |
Автор: valvliv 2.3.2006, 19:55 |
Мда... Бум изучать. Я вообще-то хотела если не как в матлабе, то хоть типа itime, но у меня проект крутит функции циклически-регулярно, и такая генерилка дает аккуратную синусоиду, что не комильфо с точки зрения случайных чисел. Простоты хочется, простоты... ![]() |
Автор: Cr@$h 2.3.2006, 20:13 |
В чем нужна простота? В интерфейсе, в объеме кода, генерим одно число или массив. С синусоидой не совсем понял... При очередном входе можно задавать разное начальное число, например, через Cpu_Time, тогда выборка не будет повторяться, если это про это. Добавлено @ 20:15 Али целые числа нужны... |
Автор: valvliv 2.3.2006, 20:52 |
> В чем нужна простота? В интерфейсе, в объеме кода, генерим одно число или массив. В объеме кода, точно. Я вот сейчас размышляю - а не сгенерить ли ряд в матлабе и сунуть его кушать фортрану... Там будет красивый гауссов белый шум, без обмана... > С синусоидой не совсем понял... При очередном входе можно задавать разное начальное число, например, через Cpu_Time, тогда выборка не будет повторяться, если это про это. Я брала секунды момента обращения к процедуре и рескейлила в интервал [0,1). Ожидала типа равномерно распределенный шум, но код работает очень методично ![]() Л. |
Автор: Cr@$h 2.3.2006, 22:05 |
Странно, я URand проверял... Быть может, не так сильно на неповторяемость. Не понял делему: либо брать из MATLAB, либо небольшой код на Fortran. Почему так? И что еще больше будет занимать... Тем не менее, убежден, что хороший генератор будет комбинированным, а поэтому немаленьким по коду. А код нужен из-за производительности или эстетического удовольствия? Буду исследовать... |
Автор: valvliv 2.3.2006, 22:08 |
Думаю, с урандом все в порядке ![]() ![]() |
Автор: Cr@$h 2.3.2006, 23:51 | ||
Ну, слава Форсайту, в смысле Фортрану. Если она все-таки не подходит или её нужно будет для массивов переделать -- тему продолжить мона. Не знаю для каких целей и платформ тебе, но URand писалась робасто. Совет по упрощению её кода при некоторых условиях:
Например, если я хочу иметь поменьше код генерации для определенной (моей) платформы, то делаю из процедуры:
Просто я взял да посчитал все константы. Можно убрать константы типа R_ и I_, если код ориентируется на одну разновидность (типа менять потом его не придется вдруг). Можно поисследовать вопрос и убрать ненужные из трех if-ов. Здесь я уже не помню всех этих премудростей. Собственно, компактный датчик: убрать вначале константы разновидностей типа, сосчитать параметры датчика заранее, убрать if-ы. Но можем потерять робастость, переносимость, надежность, но полуим точно прирост в скорости, не потеряем точно. |