Ошибка в рандомизации - random сбоит в цикле - Messages
с ув.,
Футурама
с предь1дущей она связана косвенно, но проявилась она в одном с ней примере и заметна именно через нее.
если коротко, то каждое вь1ражение, включающее предь1дущие, рассчить1ваеться, начиная с самого первого КАЖДЬ1Й раз.
пример:
x:random(10)
x=9
x=0
x=1
x=7
возможно, ето не баг, а фича, но ето НЕПРАВИЛЬНО!
при программировании мне надо иметь постоянное значение х, а каждь1й раз, обращаясь к нему, я получаю что-то другое. если б ето бь1ла функция [например "x(n):random(n)"], тогда понятно, а так прокол. исправляйте.
и еще один пример той же ошибки:
y:x^2
x:2
y=4
x:3
y=9
т.е. рассчитанное значение среда воспринимает
как ФУНКЦИЮ и каждь1й раз пересчить1вает заново.
при программировании ето недопустимо. надеюсь, исправить будет несложно. удачи.
Всегда ожидаете неожиданное. Но никогда не ожидаете что здесь хотя кто-нибудь приказам подчиняется.
тем не менее, остаеться первь1й вопрос с ошибкой рандомизации. и ето уже точно не фича.
WroteВы приложите пример ошибки, а то Ваши сообщения странные какие-то: то команды отдаёте, то хотите ответ на незаданный вопрос...
не вопрос.
ввожу следующее:
x:line(for(j,range(1,5),el(y,j):random(100)-random(100)),y,2,1)
результат:
x=mat(0,0,0,0,0,5,1)
ошибка очевидна, так как:
random(100)-random(100)=-46
или что-то другое из диапазона приблизительно +/-100. но никак не все ноли.
[MATH]x:line(for(j;range(1;5);el(y;j):eval(random(100))-eval(random(100)));y;2;1)[/MATH]
WroteА так:
[MATH]x:line(for(j;range(1;5);el(y;j):eval(random(100))-eval(random(100)));y;2;1)[/MATH]
да, так проблема решаеться, я уже ето понял. непонятно другое - почему каждь1й раз надо пропись1вать евал()? как по мне, маткадовский принцип куда как попроще.
и еще - почему в цикле считает так, а вне цикла - по другому. вот ето очень странно.
Ещё можно сказать, что функция random() определена только для численных вычислений. Можно попросить Андрея доопределить её поведение и для символьных (это возможно), тогда символьное решение почти не будет отличаться от числового.
WroteТак получается, как уже было сказано выше, из-за того, что изначально все представления выражений в SMath Studio имеют символьную природу, т.е. random(100) - это всё равно что записать "сферический конь в вакууме". Попробуйте текстом это вписать вместо random(100) (в кавычках, без eval()), посмотрите что будет. Нужно избавляться от привычки думать, что по умолчанию происходят численные вычисления. В современных математических программах уровень вычислений должен быть на уровень выше, т.е. символьный. В SMath Studio по умолчанию идёт символьная обработка, а в частности вы можете указать делать численные вычисления. Т.е. движок SMath Studio может больше, чем обычный числовой.
я бь1 не бь1л так уверен, что ето плюс. в том же Маткаде можно с успехом производить символьнь1е вь1числения, но с ФУНКЦИЯМИ. здесь же всякое определение получаеться функцией по умолчанию без параметров. такой подход сильно усложняет понимание пошаговь1х вь1числений, не говоря уже о снижении скорости расчетов.
кстати, переключение на численную оптимизацию (по контекстному меню) мало на что влияет.
ну и ето никак не обьясняет почему в цикле мь1 имеем одно, а без цикла другое.
п.с. ну, ввел я random(100) (в кавычках, без eval()). текст как текст. что я должен бь1л посмотреть?
Почему это плюс. Можно доопределить функцию random(), чтобы она работала, к примеру, с такими аргументами: random( "a".."z" ) или random( [sin(x), cos(x), tg(x)] ). При этом функция может выдавать либо произвольную букву, либо произвольно функцию из набора. Представить такое в Mathcad достаточно трудно. Есть ещё причины, почему такой подход гораздо правильнее - это пользовательские дополнения. Если нужно написать что-то своё для SMath Studio, то возможности ограничены лишь воображением и знанием математики, т.к. вы можете работать с символьным представлением выражений.
Ещё раз повторю отличие от Mathcad'а. В Mathcad все вычисления изначально численные, а символьные можно делать специально по запросу и специальному синтаксису. В SMath Studio вычисления изначально символьные, а численный результат можно получить по запросу или выбрав метод оптимизации выражения. Функции по типу random() в классическом их представлении не имеют особого смысла для символьных вычислений, поэтому эта функция не была определена для символьных расчётов. Подразумевается, что вы будете использовать её только в численном окружении, т.е. с использованием eval(). Но, повторяюсь, можно доопределить её так, что при символьных вычислениях она бы работала также как и при численных, т.е. изменив её природу на генератор символов в виде числа.
Quoteздесь же всякое определение получаеться функцией по умолчанию без параметров
Это не так. Всякое определение в SMath Studio - это набор символов в специальном формате и не более того. Снижение скорости расчётов - это неизбежная плата за посимвольную обработку. Что уж тут поделать, автором была выбрана такая идеология. Я думаю, что в расчёте на то, что со временем мощь компов будет такой, что это не будет большой проблемой. Если код был написан по-старинке в неуправляемом пространстве (т.е. компилировался бы в машинные коды реального процессора), то уже сейчас скорость была бы на порядок выше, но .Net съедает часть ресурсов, поэтому на сегодняшний день нельзя похвастать быстрыми расчётами. Их можно выполнить в дополнении, если уж так нужно, а SMath Studio использовать как удобный интерфейс.
П.С. По умолчанию - я имел в виду, что вообще без оптимизации подразумевается символьная обработка, т.е. изначально все вычисления символьные.
а не будет ли ссь1лочки на лаконичную инструкцию (справочник), а то разобратся в таких тонкостях поначалу сложновато.
п.с. я-то как раз решил, что СМат - ето дробночисленная альтернатива Маткаду без лишней символьной математики, т.с. продвинуть1й калькулятор.
-
New Posts
-
No New Posts