Что нового

Random(1, 1, 1) = 0

timsky

Осваивающий
Сообщения
93
Репутация
28
AutoIt 3.3.6.0
Windows 7 x64 En

Первый тикет был закрыт со словами, что это не глюк:
http://www.autoitscript.com/trac/autoit/ticket/1170

Второй со словами, что это пофиксили в бетке:
http://www.autoitscript.com/trac/autoit/ticket/1251

Теперь на версии 3.3.6.0 опять возвращает 0.

Код:
$rnd = Random(1, 1, 1)
MsgBox(0, @error, $rnd)


Я считаю, что генератор должен возвращать число в случае, если Мин. и Макс. одинаковые, т.к. они могут быть таковыми, если динамически изменяются в процессе выполнения скрипта и/или зависят от внешних факторов вроде кол-ва строк в тексте, запущенных процессов или введенного пользователем значения.

Тикет создал: http://www.autoitscript.com/trac/autoit/ticket/1538
Прошу единомышленников меня поддержать, если разработчики опять будут двигать, что так лучше :smile:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Возможно ты и прав, но в этом случае теряется смысл функции, ведь она не будет возвращать случайное число. Кстати, это тоже возвращает 0.

Код:
Random(1, 1.9, 1)
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
timsky сказал(а):
Теперь на версии 3.3.6.0 опять возвращает 0.

Код:
$rnd = Random(1, 1, 1)
MsgBox(0, @error, $rnd)


Я считаю, что генератор должен возвращать число в случае, если Мин. и Макс. одинаковые
А по твоему какое число должна возвращать данная команда?
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
Kaster сказал(а):
edyapd [?]
А по твоему какое число должна возвращать данная команда?
1
С одной стороны может и верно, но с другой....
Это не будет "случайным" числом. А раз функция не может выдать хотя бы одно из двух то это уже ошибка.
Так что я бы здесь оставил право выбора за разработчиками.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
edyapd [?]
Это не будет "случайным" числом
ну как говорит timsky, если эту функцию использовать в процессе, когда аргументы могут меняться в больших пределах, причем могут оказаться и равны, то результат будет в корне неверен. по идее, 1 = 1, как бы тривиально это не звучало
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
В русском хелхе к v3.2.5.4 написано:"Если Min >= Max, то возвращается 0 и значение @error будет равно 2."
То есть четко обозначено что это ошибка параметров.
Вы же когда создаете свою функцию тоже описываете при каких параметрах выводить ошибку.
timsky же не будет оспаривать ошибку при Min > Max хотя я думаю что параметры в какой то момент могут стать таковыми. Я думаю что он скорей всего введет контроль за входными параметрами. А значит и добавить такую строку не составит труда:
Код:
If $a = $b Then
	$rnd = $a
Else
	$rnd = Random($a, $b, 1)
EndIf

Для чего вызывать функцию если ответ и так известен?
Это чисто моё мнение, не предендующее на истину.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
edyapd [?]
Для чего вызывать функцию если ответ и так известен?
ну что значит известен? аргумент на то и аргумент, что может варьироваться.
а если ввести контроль за каждым аргументом, по подумай, насколько замедлиться программа. каждое сравнение занимает время, и если вызовов функций больше 100к, то разница будет ощутимой
Код:
$start = TimerInit()
For $i = 0 to 1e6
	If $i = 1e6 - $i Then
		$rnd = $i
	Else
		$rnd = Random(0, $i, 1)
	EndIf
Next
ConsoleWrite(TimerDiff($start) & @CRLF)
$start = TimerInit()
For $i = 0 to 1e6
	$rnd = Random(0, $i, 1)
Next
ConsoleWrite(TimerDiff($start) & @CRLF)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Failure: Returns 0 and sets @error flag to 1 if bad parameters.

Что и происходит при вызове Random(1, 1, 1). Значит это не баг, функция работает так, как задумана.



Добавлено:
Сообщение автоматически объединено:

Kaster, IMHO именно поэтому эта функция так и работает, сравнение в любом случае придется делать, либо его делает пользователь, либо сама функция. Если функция будет всегда проверять параметры на недопустимые значения (что в большинстве случаев просто не нужно), то она всегда будет работать медленнее.

:smile:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
timsky
Вам нужно вывести случайное число в интервале от 0 и до 1?
Вот, случайное число от 0 до 1
Код:
Random(1)
; или так
Round(Random(1),1)


Kaster [?]
ну как говорит timsky, если эту функцию использовать в процессе, когда аргументы могут меняться в больших пределах, причем могут оказаться и равны, то результат будет в корне неверен. по идее, 1 = 1, как бы тривиально это не звучало
Абсолютно верно!

edyapd сказал(а):
В русском хелхе к v3.2.5.4 написано:"Если Min >= Max, то возвращается 0 и значение @error будет равно 2."

timsky вы используете версию 3.3.6.0? Тогда зачем читать русскую справку?
Вот что пишут Eng справки:
AutoIt3.chm - 3.3.6.0
Return Value

Success: Returns a pseudo-random number between Min and Max.
Failure: Returns 0 and sets @error flag to 1 if bad parameters.

Remarks
...
If only one argument is provided, then it is interpreted to be the Max.
...
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
2 Garrett
На сей раз Вы не очень внимательно прочитали тему :smile:
Пример из русского хелпа приводил я, так как у меня нет 3.3.6.0
Но из приведеного вами примера не ясно в каком случаи будет
Failure: Returns 0 and sets @error flag to 1 if bad parameters.
Если операться только на between Min and Max, то при Min=1 и Max=1 вроди как должно выводиться 1
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Yashied [?]
либо его делает пользователь, либо сама функция
только если это делает все же пользователь, то для 1м точек замедление в 2 раза. а если его не делать, то в процессе выполнения скрипта можно получить ошибочное значение
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
А если это будет делать сама функция, то замедление будет в 2 раза всегда, независимо, нужно это или нет.

;)
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
edyapd
Да, вы правы! Спасибо что поправили!
Приношу свои извинения timsky!

edyapd [?]
Если операться только на between Min and Max, то при Min=1 и Max=1 вроди как должно выводиться 1

Так и есть. @error = 1 а значение 0, потому как 1=1 и диапазона искомых значений между 1 и 1 просто нет.

Код:
Random(1,1)
ConsoleWrite(@error)
ConsoleWrite(Random(1,1))
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
имхо, так и так есть эта проверка. просто сейчас к примеру она такая
Код:
if $min < $max then
   ;do random
endif


наверняка можно сделать так
Код:
if $min <= $max then
   ;do random
endif
 
Автор
timsky

timsky

Осваивающий
Сообщения
93
Репутация
28
Полностью согласен с Kaster.
Сделать нужно всего одну поправку: Если Min и Max равны, то выдать это число.
Вот например, сейчас пишу скрипт, где Min либо меньше, либо на крайняк может быть равен Max, а сколько лишних телодвижений приходится делать, чтобы обойти это ограничение. И это уже не первый раз, когда сталкиваюсь с этой проблемой.

Мне кажется, что логика должна быть таковой:
Функция возвращает рандомное значение в диапазоне от Min до Max.
Естественно, когда Min > Max, то это ошибка. Но когда эти аргументы равны, то диапазон просто сужается до одного единственного значения.

Ну и, наконец, во втором тикете Valik конкретно указал, что в какой-то бетуе эта функция УЖЕ возвращает 1.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
timsky сказал(а):
Полностью согласен с Kaster.
Сделать нужно всего одну поправку: Если Min и Max равны, то выдать это число.
Вот например, сейчас пишу скрипт, где Min либо меньше, либо на крайняк может быть равен Max, а сколько лишних телодвижений приходится делать, чтобы обойти это ограничение. И это уже не первый раз, когда сталкиваюсь с этой проблемой.

Мне кажется, что логика должна быть таковой:
Функция возвращает рандомное значение в диапазоне от Min до Max.
Естественно, когда Min > Max, то это ошибка. Но когда эти аргументы равны, то диапазон просто сужается до одного единственного значения.

Ну и, наконец, во втором тикете Valik конкретно указал, что в какой-то бетуе эта функция УЖЕ возвращает 1.

Проверка на равенство это хорошо, но скажите, пожалуйста, по логике, есть смысл выбирать случайное число, из диапазона который состоит из одного числа? Где логика? Если вам нужно это число так задайте его прямо!
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Garrett
в ручную - нет. но если операция изъятия произвольного числа содержится в другой функции, причем пределы являются параметрами большой функции тоже, то становится накладным проводить каждый раз сравнение пределов на идентичность становится накладным
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Kaster если вас не затруднит, приведите пример, пожалуйста. Просто мне на самом деле трудно представить, где понадобится значение:
Код:
Random(1,1,1)

Если 1 это и есть 1
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
А что мешает самим соорудить функцию с проверкой:

Код:
ConsoleWrite(_Random(1, 1) & @LF)

Func _Random($iMin=0, $iMax=1, $iFlag=0)
	If $iMin < $iMax Then
		Return Random($iMin, $iMax, $iFlag)
	EndIf
	
	Return $iMax
EndFunc
 
Верх