Автор Тема: Random(1, 1, 1) = 0  (Прочитано 15577 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн timsky [?]

  • Осваивающий
  • **
  • Сообщений: 93
  • Репутация: 28
  • Пол: Мужской
    • Персональный блог об AutoIt, Miranda, железе, полезном софте и прочей лабуде...
    • Награды
Random(1, 1, 1) = 0
« Создано: Март 26, 2010, 05:07:41 »
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.

Код: AutoIt [Выделить]
$rnd = Random(1, 1, 1)
MsgBox(0, @error, $rnd)


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

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

Русское сообщество AutoIt

Random(1, 1, 1) = 0
« Отправлен: Март 26, 2010, 05:07:41 »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Random(1, 1, 1) = 0
« Ответ #1, Отправлен: Март 26, 2010, 11:20:03 »
Возможно ты и прав, но в этом случае теряется смысл функции, ведь она не будет возвращать случайное число. Кстати, это тоже возвращает 0.

Код: AutoIt [Выделить]
Random(1, 1.9, 1)

« Последнее редактирование: Март 26, 2010, 11:30:55 от Yashied »


Думай, прежде чем говорить.

Оффлайн edyapd [?]

  • Осваивающий
  • **
  • Сообщений: 380
  • Репутация: 30
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Random(1, 1, 1) = 0
« Ответ #2, Отправлен: Март 26, 2010, 12:07:35 »
Теперь на версии 3.3.6.0 опять возвращает 0.

Код: AutoIt [Выделить]
$rnd = Random(1, 1, 1)
MsgBox(0, @error, $rnd)


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

Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4020
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Random(1, 1, 1) = 0
« Ответ #3, Отправлен: Март 26, 2010, 12:40:43 »
edyapd  [?]
Цитировать
А по твоему какое число должна возвращать данная команда?
1
Конференция посвященная AutoIt на jabber.ru - [email protected]
Как попасть на конференцию читаем тут


Русское сообщество AutoIt

Re: Random(1, 1, 1) = 0
« Ответ #3 Отправлен: Март 26, 2010, 12:40:43 »

Оффлайн edyapd [?]

  • Осваивающий
  • **
  • Сообщений: 380
  • Репутация: 30
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Random(1, 1, 1) = 0
« Ответ #4, Отправлен: Март 26, 2010, 12:48:32 »
edyapd  [?]
Цитировать
А по твоему какое число должна возвращать данная команда?
1
С одной стороны может и верно, но с другой....
Это не будет "случайным" числом. А раз функция не может выдать хотя бы одно из двух то это уже ошибка.
Так что я бы здесь оставил право выбора за разработчиками.

Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4020
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Random(1, 1, 1) = 0
« Ответ #5, Отправлен: Март 26, 2010, 12:53:45 »
edyapd  [?]
Цитировать
Это не будет "случайным" числом
ну как говорит timsky, если эту функцию использовать в процессе, когда аргументы могут меняться в больших пределах, причем могут оказаться и равны, то результат будет в корне неверен. по идее, 1 = 1, как бы тривиально это не звучало

Оффлайн edyapd [?]

  • Осваивающий
  • **
  • Сообщений: 380
  • Репутация: 30
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Random(1, 1, 1) = 0
« Ответ #6, Отправлен: Март 26, 2010, 13:10:11 »
В русском хелхе к v3.2.5.4 написано:"Если Min >= Max, то возвращается 0 и значение @error будет равно 2."
То есть четко обозначено что это ошибка параметров.
Вы же когда создаете свою функцию тоже описываете при каких параметрах выводить ошибку.
timsky же не будет оспаривать ошибку при Min > Max хотя я думаю что параметры в какой то момент могут стать таковыми. Я думаю что он скорей всего введет контроль за входными параметрами. А значит и добавить такую строку не составит труда:
Код: AutoIt [Выделить]
If $a = $b Then
    $rnd = $a
Else
    $rnd = Random($a, $b, 1)
EndIf

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

Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4020
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Random(1, 1, 1) = 0
« Ответ #7, Отправлен: Март 26, 2010, 13:21:02 »
edyapd  [?]
Цитировать
Для чего вызывать функцию если ответ и так известен?
ну что значит известен? аргумент на то и аргумент, что может варьироваться.
а если ввести контроль за каждым аргументом, по подумай, насколько замедлиться программа. каждое сравнение занимает время, и если вызовов функций больше 100к, то разница будет ощутимой
Код: AutoIt [Выделить]
$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)
 


Русское сообщество AutoIt

Re: Random(1, 1, 1) = 0
« Ответ #7 Отправлен: Март 26, 2010, 13:21:02 »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Random(1, 1, 1) = 0
« Ответ #8, Отправлен: Март 26, 2010, 13:21:48 »
Цитировать
Failure: Returns 0 and sets @error flag to 1 if bad parameters.

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



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

:)
« Последнее редактирование: Март 26, 2010, 13:29:40 от Yashied, Причина: Объединение сообщений »

Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3999
  • Репутация: 960
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Random(1, 1, 1) = 0
« Ответ #9, Отправлен: Март 26, 2010, 14:28:01 »
timsky
Вам нужно вывести случайное число в интервале от 0 и до 1?
Вот, случайное число от 0 до 1
Код: AutoIt [Выделить]
Random(1)
; или так
Round(Random(1),1)


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

В русском хелхе к 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
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Random(1, 1, 1) = 0
« Ответ #10, Отправлен: Март 26, 2010, 14:44:00 »
2 Garrett
На сей раз Вы не очень внимательно прочитали тему :)
Пример из русского хелпа приводил я, так как у меня нет 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 [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4020
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Random(1, 1, 1) = 0
« Ответ #11, Отправлен: Март 26, 2010, 14:56:54 »
Yashied  [?]
Цитировать
либо его делает пользователь, либо сама функция
только если это делает все же пользователь, то для 1м точек замедление в 2 раза. а если его не делать, то в процессе выполнения скрипта можно получить ошибочное значение

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Random(1, 1, 1) = 0
« Ответ #12, Отправлен: Март 26, 2010, 14:59:53 »
А если это будет делать сама функция, то замедление будет в 2 раза всегда, независимо, нужно это или нет.

;)

Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3999
  • Репутация: 960
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Random(1, 1, 1) = 0
« Ответ #13, Отправлен: Март 26, 2010, 15:15:37 »
edyapd
Да, вы правы! Спасибо что поправили!
Приношу свои извинения timsky!

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

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

Код: AutoIt [Выделить]

Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4020
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Random(1, 1, 1) = 0
« Ответ #14, Отправлен: Март 26, 2010, 15:18:03 »
имхо, так и так есть эта проверка. просто сейчас к примеру она такая
Код: AutoIt [Выделить]
if $min < $max then
   ;do random
endif


наверняка можно сделать так
Код: AutoIt [Выделить]
if $min <= $max then
   ;do random
endif


Русское сообщество AutoIt

Re: Random(1, 1, 1) = 0
« Ответ #14 Отправлен: Март 26, 2010, 15:18:03 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
2 Ответов
2713 Просмотров
Последний ответ Сентябрь 05, 2011, 21:40:37
от jilexandr
4 Ответов
2349 Просмотров
Последний ответ Октябрь 15, 2011, 14:36:43
от Zaramot
10 Ответов
5894 Просмотров
Последний ответ Январь 19, 2012, 23:56:47
от vadimkou
1 Ответов
1696 Просмотров
Последний ответ Февраль 28, 2013, 13:32:45
от madmasles
4 Ответов
2657 Просмотров
Последний ответ Май 19, 2013, 14:37:02
от takse
1 Ответов
714 Просмотров
Последний ответ Февраль 25, 2015, 00:59:58
от CreatoR
5 Ответов
1448 Просмотров
Последний ответ Сентябрь 29, 2015, 23:31:43
от Kaster
4 Ответов
869 Просмотров
Последний ответ Декабрь 16, 2015, 21:00:56
от ra4o
2 Ответов
1092 Просмотров
Последний ответ Январь 16, 2016, 15:10:04
от chernobeloe
5 Ответов
1240 Просмотров
Последний ответ Май 31, 2016, 23:35:44
от inververs