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

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

#1 Опубликовано: 06.06.2013 12:32:07
futurama81

futurama81

0 сообщений из 8 понравились пользователям.

Группа: User

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

с ув.,
Футурама
#2 Опубликовано: 06.06.2013 15:35:34
futurama81

futurama81

0 сообщений из 8 понравились пользователям.

Группа: 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 Опубликовано: 06.06.2013 16:41:05
Mike Kaganski

Mike Kaganski

184 сообщений из 434 понравились пользователям.

Группа: User

Это не баг, а фича. Вы используете символьное определение, т.е. x - это не число, возвращаемое ф-цией random(10), а синоним выражения random(10). Воспользуйтесь ф-цией eval().
С уважением, Михаил Каганский
1 пользователям понравился этот пост
futurama81 07.06.2013 02:13:00
#4 Опубликовано: 06.06.2013 16:47:42
Martin Kraska

Martin Kraska

1222 сообщений из 2150 понравились пользователям.

Группа: Moderator

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

Всегда ожидаете неожиданное. Но никогда не ожидаете что здесь хотя кто-нибудь приказам подчиняется.
Martin Kraska Pre-configured portable distribution of SMath Studio: https://en.smath.info/wiki/SMath%20with%20Plugins.ashx
1 пользователям понравился этот пост
futurama81 07.06.2013 02:13:00
#5 Опубликовано: 07.06.2013 02:14:40
futurama81

futurama81

0 сообщений из 8 понравились пользователям.

Группа: User

спасибо ответившим.
тем не менее, остаеться первь1й вопрос с ошибкой рандомизации. и ето уже точно не фича.
#6 Опубликовано: 07.06.2013 03:12:48
Mike Kaganski

Mike Kaganski

184 сообщений из 434 понравились пользователям.

Группа: User

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

futurama81

0 сообщений из 8 понравились пользователям.

Группа: 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 Опубликовано: 07.06.2013 04:16:25
уни

уни

156 сообщений из 355 понравились пользователям.

Группа: User

А так:


[MATH]x:line(for(j;range(1;5);el(y;j):eval(random(100))-eval(random(100)));y;2;1)[/MATH]
Россия навсегда! Вячеслав Мезенцев
1 пользователям понравился этот пост
futurama81 07.06.2013 04:23:00
#9 Опубликовано: 07.06.2013 04:25:27
futurama81

futurama81

0 сообщений из 8 понравились пользователям.

Группа: 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 Опубликовано: 07.06.2013 04:33:36
уни

уни

156 сообщений из 355 понравились пользователям.

Группа: User

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

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

futurama81

0 сообщений из 8 понравились пользователям.

Группа: 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 Опубликовано: 07.06.2013 05:27:44
уни

уни

156 сообщений из 355 понравились пользователям.

Группа: 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(). Но, повторяюсь, можно доопределить её так, что при символьных вычислениях она бы работала также как и при численных, т.е. изменив её природу на генератор символов в виде числа.

Цитата

здесь же всякое определение получаеться функцией по умолчанию без параметров


Это не так. Всякое определение в SMath Studio - это набор символов в специальном формате и не более того. Снижение скорости расчётов - это неизбежная плата за посимвольную обработку. Что уж тут поделать, автором была выбрана такая идеология. Я думаю, что в расчёте на то, что со временем мощь компов будет такой, что это не будет большой проблемой. Если код был написан по-старинке в неуправляемом пространстве (т.е. компилировался бы в машинные коды реального процессора), то уже сейчас скорость была бы на порядок выше, но .Net съедает часть ресурсов, поэтому на сегодняшний день нельзя похвастать быстрыми расчётами. Их можно выполнить в дополнении, если уж так нужно, а SMath Studio использовать как удобный интерфейс.

П.С. По умолчанию - я имел в виду, что вообще без оптимизации подразумевается символьная обработка, т.е. изначально все вычисления символьные.
SMathStudio_screen1.png
Россия навсегда! Вячеслав Мезенцев
1 пользователям понравился этот пост
Serg 07.06.2013 06:17:00
#13 Опубликовано: 07.06.2013 06:25:11
futurama81

futurama81

0 сообщений из 8 понравились пользователям.

Группа: User

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

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