Ошибка в рандомизации

Ошибка в рандомизации - random сбоит в цикле - Messages

#1 Posted: 6/6/2013 12:32:07 PM
futurama81

futurama81

0 likes in 8 posts.

Group: User

если в цикле использовать подряд ф-цию random с одинаковь1м параметром, то ИНОГДА получается, что генерируется одно и то же значение (возможно, зависит от степени вложенности, у меня от 2-3-го уровня сбоит, иногда уже от 1-го). разберитесь, пожалуйста.

с ув.,
Футурама
#2 Posted: 6/6/2013 3:35:34 PM
futurama81

futurama81

0 likes in 8 posts.

Group: User

и еще одна ошибка.
с предь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вает заново.
при программировании ето недопустимо. надеюсь, исправить будет несложно. удачи.
#3 Posted: 6/6/2013 4:41:05 PM
Mike Kaganski

Mike Kaganski

184 likes in 434 posts.

Group: User

Это не баг, а фича. Вы используете символьное определение, т.е. x - это не число, возвращаемое ф-цией random(10), а синоним выражения random(10). Воспользуйтесь ф-цией eval().
С уважением, Михаил Каганский
1 users liked this post
futurama81 6/7/2013 2:13:00 AM
#4 Posted: 6/6/2013 4:47:42 PM
Martin Kraska

Martin Kraska

1222 likes in 2150 posts.

Group: Moderator

Вы просто попали в ловушку символьлой оптимизации. Первое начало общения с SMath для новичок: "Руки прочь от символьлой оптимизации" (правая кнопка мыши дает меню, там выберете "Оптимизация Численная" для каждого определения). Символьная оптимизация значит что присваивается выражение, численная оптимизация значит что присваивается значение выражения в моменте присваивания. Убедитесь этим динамической помощю - она покажет, что именно было присвоено, когда вводите имю переменной (х).

Всегда ожидаете неожиданное. Но никогда не ожидаете что здесь хотя кто-нибудь приказам подчиняется.
Martin Kraska Pre-configured portable distribution of SMath Studio: https://en.smath.info/wiki/SMath%20with%20Plugins.ashx
1 users liked this post
futurama81 6/7/2013 2:13:00 AM
#5 Posted: 6/7/2013 2:14:40 AM
futurama81

futurama81

0 likes in 8 posts.

Group: User

спасибо ответившим.
тем не менее, остаеться первь1й вопрос с ошибкой рандомизации. и ето уже точно не фича.
#6 Posted: 6/7/2013 3:12:48 AM
Mike Kaganski

Mike Kaganski

184 likes in 434 posts.

Group: User

Вы приложите пример ошибки, а то Ваши сообщения странные какие-то: то команды отдаёте, то хотите ответ на незаданный вопрос...
С уважением, Михаил Каганский
#7 Posted: 6/7/2013 3:29:31 AM
futurama81

futurama81

0 likes in 8 posts.

Group: User

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. но никак не все ноли.
#8 Posted: 6/7/2013 4:16:25 AM
уни

уни

156 likes in 355 posts.

Group: User

А так:


[MATH]x:line(for(j;range(1;5);el(y;j):eval(random(100))-eval(random(100)));y;2;1)[/MATH]
Россия навсегда! Вячеслав Мезенцев
1 users liked this post
futurama81 6/7/2013 4:23:00 AM
#9 Posted: 6/7/2013 4:25:27 AM
futurama81

futurama81

0 likes in 8 posts.

Group: User

Wrote

А так:


[MATH]x:line(for(j;range(1;5);el(y;j):eval(random(100))-eval(random(100)));y;2;1)[/MATH]



да, так проблема решаеться, я уже ето понял. непонятно другое - почему каждь1й раз надо пропись1вать евал()? как по мне, маткадовский принцип куда как попроще.
и еще - почему в цикле считает так, а вне цикла - по другому. вот ето очень странно.
#10 Posted: 6/7/2013 4:33:36 AM
уни

уни

156 likes in 355 posts.

Group: User

Так получается, как уже было сказано выше, из-за того, что изначально все представления выражений в SMath Studio имеют символьную природу, т.е. random(100) - это всё равно что записать "сферический конь в вакууме". Попробуйте текстом это вписать вместо random(100) (в кавычках, без eval()), посмотрите что будет. Нужно избавляться от привычки думать, что по умолчанию происходят численные вычисления. В современных математических программах уровень вычислений должен быть на уровень выше, т.е. символьный. В SMath Studio по умолчанию идёт символьная обработка, а в частности вы можете указать делать численные вычисления. Т.е. движок SMath Studio может больше, чем обычный числовой. Поэтому его поведение кажется странным, если к этому не привыкнуть.

Ещё можно сказать, что функция random() определена только для численных вычислений. Можно попросить Андрея доопределить её поведение и для символьных (это возможно), тогда символьное решение почти не будет отличаться от числового.
Россия навсегда! Вячеслав Мезенцев
#11 Posted: 6/7/2013 4:58:23 AM
futurama81

futurama81

0 likes in 8 posts.

Group: User

Wrote

Так получается, как уже было сказано выше, из-за того, что изначально все представления выражений в SMath Studio имеют символьную природу, т.е. random(100) - это всё равно что записать "сферический конь в вакууме". Попробуйте текстом это вписать вместо random(100) (в кавычках, без eval()), посмотрите что будет. Нужно избавляться от привычки думать, что по умолчанию происходят численные вычисления. В современных математических программах уровень вычислений должен быть на уровень выше, т.е. символьный. В SMath Studio по умолчанию идёт символьная обработка, а в частности вы можете указать делать численные вычисления. Т.е. движок SMath Studio может больше, чем обычный числовой.



я бь1 не бь1л так уверен, что ето плюс. в том же Маткаде можно с успехом производить символьнь1е вь1числения, но с ФУНКЦИЯМИ. здесь же всякое определение получаеться функцией по умолчанию без параметров. такой подход сильно усложняет понимание пошаговь1х вь1числений, не говоря уже о снижении скорости расчетов.

кстати, переключение на численную оптимизацию (по контекстному меню) мало на что влияет.

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

п.с. ну, ввел я random(100) (в кавычках, без eval()). текст как текст. что я должен бь1л посмотреть?
#12 Posted: 6/7/2013 5:27:44 AM
уни

уни

156 likes in 355 posts.

Group: User

Вы как любитель Mathcad'а должны были понять разницу между Mathcad'ом и SMath Studio. В Mathcad все вычисления изначально численные, поэтому такой пример в нём не заработает и возникнет ошибка вычислений. В SMath Studio это работает, можно вычитать строки, хотя в этом и мало смысла. Это говорит о том, что Mathcad ограничен изначально, он понимает только числа и только операции с числами, матрицами из чисел. Это числодробилка по типу Matlab'а. Если понадобится кроме численного вычисления вывести формулу в пакете, то тут Mathcad вскидывает лапки кверху. Кроме того, Mathcad не имеет своего символьного движка. Раньше это был встроенный и кастрированный Maple, сейчас - встроенный и кастрированный опять же MuPad.

Почему это плюс. Можно доопределить функцию 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 использовать как удобный интерфейс.

П.С. По умолчанию - я имел в виду, что вообще без оптимизации подразумевается символьная обработка, т.е. изначально все вычисления символьные.
SMathStudio_screen1.png
Россия навсегда! Вячеслав Мезенцев
1 users liked this post
Serg 6/7/2013 6:17:00 AM
#13 Posted: 6/7/2013 6:25:11 AM
futurama81

futurama81

0 likes in 8 posts.

Group: User

ах, вот оно что. спасибо за разьяснения.
а не будет ли ссь1лочки на лаконичную инструкцию (справочник), а то разобратся в таких тонкостях поначалу сложновато.

п.с. я-то как раз решил, что СМат - ето дробночисленная альтернатива Маткаду без лишней символьной математики, т.с. продвинуть1й калькулятор.
  • New Posts New Posts
  • No New Posts No New Posts