Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Да вряд ли, No_Name. Эта функция линейно зависит от функции генератора, так что если есть проблемы, то их надо искать именно в MathRand(). А аргументы твои неубедительны. Нарушения равномерности не должно быть. Проверь на скрипте ниже, подставив свою функцию вместо MathRand() и изменив размерность массива freq[].
Mak, ты меня напугал. Чтобы разобраться и с этим, нацарапал простенький скрипт для генерации миллиарда чисел, и для каждого от 0 до 32767 вычисляется частота. Выход скрипта - две частоты, минимальная и максимальная. Прогони его пару десятков раз. Я не стал строго проверять нулевую гипотезу о равномерности, но, по-моему, результаты должны тебя убедить.
x (x_min <= x <= x_max) --> y (y_min <= y <= y_max): y = a + b * x;
a = (y_min * x_max - y_max * x_min) / (x_max - x_min);
b = (y_max - y_min) / (x_max - x_min);
Линейное преобразование не меняет тип функции распределения, а лишь подвергает ее сдвигу и сжатию либо растяжению. При этом белый шум остается белым шумом. Хорошо известный пример изменения типа функции распределения -- генерация СЧ с гауссовым распределением популярным методом "логарифмической пары", т.е. применением нелинейного преобразования к изначально равномерно-распределенной последовательности СЧ.
<Подробный комментарий сожрал форум.>
Лично я пользуюсь способом Notepad + ^C + ^V, чего и всем желаю.
Есть ощущение, что при использовании некоторых слов в сообщении на форуме срабатывает какой-то фильтр, и имитирует сбой :))
Да, я имел в виду то, про что потом писал No_Name
Проблема связана с низкой дискретностью исходного ряда (функции MathRand())
Пробуйте, два варианта - Max = 32767 и Max = 16383.
Если вас результаты устраивают, флаг в руки.
Во всех остальных случаях она врет - иногда много, иногда немного.
По этой причине использовать MathRand проблематично.
Скомбинировать из нее чтото более приличное тоже невозможно.
Выходов только два:
1 - убедить разработчиков добавить еще одну, хорошую функцию,
2 - открыть Кнута, и написать ее самому на MQL.
Как паллиатив для улучшения качества штатного ГСЧ можно предложить методику случайной перетасовки специфически инициализированной генерируемой последовательности СЧ. В аттаче пример такого подхода для VB6 (взято из кн.: Д.К. Крейг, Д. Уэбб. Microsoft Visual Basic 6.0. Мастерская разработчика. Изд. 5-е. М., "Русская редакция", 2001, с. 499).
В большинстве случаев будет получаться совсем не то, что ожидается.
Интересно, насколько часто возникает небходимость генерировать СЧ с точностью 4+ знака? Если достаточно меньшей точности, или, что эквивалентно, нужно генерировать целые случайные числа в диапазоне, меньшем 32768, проблему можно обойти (с некоторой пренебрежимой потерей к.п.д). Допустим нужно генерировать целые СЧ в диапазоне от 1 до N.
Для начала найдём k = 32768/N .
После этого просто запишем условие if (MathRand()>= k*N) "нуегонафигэточисло";
else "авотсэтимпоработаем";