Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Написал робота? Опубликуй его в Маркете и получай доход!
Андрей
84
Андрей 2007.07.25 21:47 
Господа, подскажите, пожалуйста, алгоритм для функции возвращающей случайное число в заданном диапазоне. Max и min диапазона должны передаваться в качестве параметров функции.
Что-то никак не придумаю от чего даже оттолкнуться :(
Glaswegian
485
Glaswegian 2007.07.25 22:09  
int MathRandRange(int min, int max)
{
    return (MathRand() / 32768. * (max - min + 1) + min);
}
Андрей
84
Андрей 2007.07.25 23:05  
Большое спасибо!
То что нужно!
Андрей
84
Андрей 2007.07.26 13:48  
Хочу ещё вот что спросить.
Какова роль точки после числа 32768 ?
В документации ничего не смог найти по этому поводу, а без этого не до конца понимаю принцип работы.
Christo Tsvetanov
994
Christo Tsvetanov 2007.07.26 14:46  

Вообще-то нужно писать 32768.0 и означает, что число это не int, а double. Иначе будет целочисленное деление, что сильно отличается от нормального.

Alexandre
602
Alexandre 2007.07.26 14:47  
int MathRand( )

Функция возвращает псевдослучайное целое число в дипазоне от 0 до 32767.

32768. имеет тип double. Без этой точки результат деления будет всегда 0, т.к. меньшее целое число делится на большее. См. в документации и на форуме о неявном приведении типов.
Андрей
84
Андрей 2007.07.26 14:52  
Всем спасибо.
Сбило с толку отсутствие ноля.
Юрий Макаров
358
Юрий Макаров 2007.07.27 00:55  
Только будте осторожнее с этой функцией.
Результат может быть неожиданным - разные числа будут иметь разные вероятности, а некоторые могут не выпадать вообще.

Почему?
Лень писать второй раз.
Подробный комментарий сожрал форум.
Sceptic Philozoff
Модератор
17849
Sceptic Philozoff 2007.07.27 06:49  
Mak писал (а): Подробный комментарий сожрал форум.
По каким ключевым словам твой коммент можно найти? Качество функции для меня действительно критично.

Функция, по комментарию stringo в 'Вопрос от новичка: две кривые в разных окнах' , является оберткой стандартной Сишной из CRT. Лично мне этот генератор пока нравится, распределение вполне равномерное.
Андрей
84
Андрей 2007.07.27 09:26  
Возможно, Маk имел ввиду не функцию MathRand( ), а функцию приведенную выше?
А проблемы, возможные при использовании, скорее всего связаны с тем что мы загоням числа в диапазон значений.
Андрей
84
Андрей 2007.07.27 09:50  
Попробую привести пример.
Возьмём значения min=1, max=100.
return (MathRand() / 32768. * (max - min + 1) + min);
Если MathRand() вернёт, например, 1, то то функция вернёт тоже 1.
Если MathRand() вернёт 50, то функция вернёт всёравно 1. И будет возвращать единицу для любых значений MathRand() от 1 до, примерно, 330. Далее будет возвращаться уже двойка. И т.д.
Генератор то и хороший, но в данной функции распределение получается совершенно другим.
/ /1234
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий