Как получить случайное число в N-ном деапазоне ? - страница 7

 
Aleksey Vyazmikin #:

Подыму ветку, ибо вижу тут умных людей.

Ситуация такая, нужно мне при инициализации рандомить настройки - выяснилось, что комбинации очень сильно повторяются, т.е. допустим мне нужно получить случайное значение от 0 до 99, при этом получаю 6 раз его, и из 1000 случаев в 11 я имею одинаковую комбинацию выпадания последовательно этих 6 значений - как сделать реальный рандом при инициализации? Может как то привязаться к локальным часам или ещё как? Использовал разные тут предложенные функции (нужна без dll).

Визуализация повторений


Прикладываю код советника, который при оптимизации выдает значение случайных генераторов.

Реальный-то вот так и работает. А нужен, значит, нереальный. А если сгенерировать массив со всеми вариантами, перемешать его и последовательно выбирать наборы?

Ну или сохранять в файле последнюю 1000 наборов, а при получении нового случайного набора смотреть, чтобы его не было в файле.

 
Vitaly Murlenko #:

Хы, идея возникла. Берём текущую котировку на любом торговом инструменте. Из неё извлекаем последние 2 цифры после запятой. Превращаем их в целое число. Это можно сделать через операции со строками - сначала дубль в строку, затем в другую переменную 2 последние цифры, затем строку в инт. Получим случайное двухразрядное число. 

Не такое уж оно и случайное.
 
Maxim Kuznetsov #:

это смотря что, как, и зачем потом ты с ним делаешь. Вообще привычный MathRand() годен только для генерации идентификаторов.

в качестве источника энтропии для (не к ночи упомянуто) нейронок - вообще не подходит

Да по сути то и делаю, что в коде показано - по цифрам случайным произвожу настройку советников из сохраненных комбинаций. Генерируется номер настройки, потом номер комбинации - первых 30, вторых по разному - в пределах 200 штук.

 
Nikolai Semko #:
Не может быть такого.
Ищите семантическую ошибку 

Если найдете ошибку - буду признателен!

 
Nikolai Semko #:

что за функцией  ranвlong вы пользуетесь? Какое то горе от ума.


это будет попроще, правильнее и побыстрее.

но случайный long - это явный перебор.
Вполне достаточно использовать :
в этой функции будет генерироваться случайное число от 0 до 1073741824

Функцию тут и взял - ранее предложил участник. Это не важно - пробовал разные варианты, исход тот же.

 
Dmitry Fedoseev #:

Реальный-то вот так и работает. А нужен, значит, нереальный. А если сгенерировать массив со всеми вариантами, перемешать его и последовательно выбирать наборы?

Ну или сохранять в файле последнюю 1000 наборов, а при получении нового случайного набора смотреть, чтобы его не было в файле.

Не знаю, на сколько это реально будет рассчитать все комбинации - даже не знаю, как это сделать.

А перемешивать каким способом предлагаете?

Не сохранять в файл не хотелось бы, так как используется это в оптимизации с кучей удаленных агентов.

 
Dmitry Fedoseev #:

А вот два варианта long (просто long без диапазона):

Хе, неправильные у меня функции тут - https://www.mql5.com/ru/forum/296430/page5#comment_10070081

На 15 надо сдвигать, а не на 16. Потому что 32767 - это сумма по всем 15 битам, а не 32768, что есть только один 16-ый бит.. 

Надеюсь, доставил всем участникам этой темы несказанное удовольствие))

 
Aleksey Vyazmikin #:

Не знаю, на сколько это реально будет рассчитать все комбинации - даже не знаю, как это сделать.

А перемешивать каким способом предлагаете?

Не сохранять в файл не хотелось бы, так как используется это в оптимизации с кучей удаленных агентов.

Диапазоны изменения всех параметров определены, шаги изменения каждого параметра тоже известны. Дальше придумать можно, если нужно. Можно даже не генерировать массив, а вычислять N-ый набор. Что-то типа календаря Майя.

Массив перемешать - это вообще не проблема - менять местами два случайных элемента массива.

---

Разумеется, не прямо в файл сохранять, а через фрейм возвращать данные, потом их сохранять. Но все равно будет дублирование вариантов, потому что агенты параллельно работают.

---

А почему бы просто не оптимизировать эксперта, используя генетический алгоритм тестера? 

 
Aleksey Vyazmikin #:

Да по сути то и делаю, что в коде показано - по цифрам случайным произвожу настройку советников из сохраненных комбинаций. Генерируется номер настройки, потом номер комбинации - первых 30, вторых по разному - в пределах 200 штук.

тогда привычного MathRand вам за глаза и с лихвой :-)

-----

кстати про настройку советников, если советник не лютый ночной скальпер, то все настройки и оптимизации сводится всего-то к сравнению с картинкой:

вариантов собственно немного:

- картина почти в точности совпадает. Робота придётся выбросить
- более глубокие и резкие впадины - у вас в руках потенциальный (контр)трендовый личный грааль. Входы/выходы близки к оптимальным
- смещено и искажено (или впадины стали нечёткими, что побочный эффект смещений)- используются сильно опаздывающие сигналы, скорее всего не лечится
- пики и впадины инвертированы - офигенный флетовый скальпер

 
Aleksey Vyazmikin #:

Если найдете ошибку - буду признателен!

попробуйте в начале OnInit поставить  MathSrand(GetTickCount());

Причина обращения: