Можно ли рандомизатор сделать ещё более рандомным?

 

Есть стратегия, у нее есть параметры и есть некоторое поле - в файле эксперта у меня класс стратегии и это поле этого класса, в файле эксперта создается объект класса стратегии и инициируется это поле. Инициируется рандомизатором.  MathRand() пробовал, rand() пробовал. Это поле в моей импровизированной стратегии отвечает за максимальное кол-во сделок, которое стратегия может сделать, назовем его maxTrades. В данной стратегии нет специальных условий для входа, вхожу а каждой свече, поэтому кол-во сделок у прохода будет равно maxTrades.


Далее делаю оптимизацию (полный перебор) по некоторым параметрам стратегии. Эти параметры в стратегии не на что не влияют, просто нужны чтобы организовать множество проходов.



Почему-то всегда если сортировать по id прохода кол-во трейдов (которое, напомню, равно срандомленному maxTrades)  сгруппировано в кластеры, т.е. идут прогоны с кол-вом сделок 5,5,5,5 потому, например, 7,7,7,7,7,7 потом 3,3,3  и т.д., ожидал что будет что-то типа 1,2,6,4,10,4,7,3. Как будто рандомизатор то ли одно число рандомит несколько раз, то ли файл советника не запускается заново на каждом прогоне, а только при каком-то доп. условии. В общем не до конца понимаю как это работает. А может и я где-то накосячил, конечно, хотя не понятно где тут можно накосячить. В общем хочется понять причины чтобы либо это починить (если баг), либо учесть (если фича) и т.д.


 

 

MathSrand(GetTickCount());

Пробовали?

По идее этого должно быть достаточно.

 
transcendreamer #:

MathSrand(GetTickCount());

Пробовали?

По идее этого должно быть достаточно.

Ну как я понял MathSrand() это установка seed рандомизации. В OnTesterInit() дергаю этот метод. Но он влияет на воспроизводимость дальнейшей рандомизации, а дальше дергаю MathRand() или rand() и вот они уже ведут себя необычно.

 
Replikant_mih #:

Ну как я понял MathSrand() это установка seed рандомизации. В OnTesterInit() дергаю этот метод. Но он влияет на воспроизводимость дальнейшей рандомизации, а дальше дергаю MathRand() или rand() и вот они уже ведут себя необычно.

А что если MathSrand перенести в начало OnTester() ?

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

 
Replikant_mih #:

Ну как я понял MathSrand() это установка seed рандомизации. В OnTesterInit() дергаю этот метод. Но он влияет на воспроизводимость дальнейшей рандомизации, а дальше дергаю MathRand() или rand() и вот они уже ведут себя необычно.

OnTesterInit() вызывается однократно перед началом оптимизации. А перед началом очередного прохода вызывается OnTesterPass()
 
transcendreamer #:

MathSrand(GetTickCount());

Пробовали?

По идее этого должно быть достаточно.

только не GetTickCount(), который не факт что в оптимизаторе в любом билде, тем паче в агентах, работает. Создать временный файл, прочесть системную метку времени и её отправить уже в MathSrand.
И даже этого недостаточно, чем-то ещё надо разбовлять seed, потому что всё остальное псевдо-виртуальное окружение слишком одинаково. 
Тут впору делать большое исследование, достойное нормальной статьи. Получать рандомный рандом, это крайне важная вещь.

 
Maxim Kuznetsov #:

только не GetTickCount(), который не факт что в оптимизаторе в любом билде, тем паче в агентах, работает. Создать временный файл, прочесть системную метку времени и её отправить уже в MathSrand.
И даже этого недостаточно, чем-то ещё надо разбовлять seed, потому что всё остальное псевдо-виртуальное окружение слишком одинаково. 
Тут впору делать большое исследование, достойное нормальной статьи. Получать рандомный рандом, это крайне важная вещь.

GetTickCount() должен и в тестер разные значения выдавать, если метаквоты не накосячили как обычно.

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

используйте СБ, в ней все давно есть:

https://www.mql5.com/ru/forum/324066#comment_13500222

Парни, как более-менее рандом написать?
Парни, как более-менее рандом написать?
  • 2019.10.10
  • www.mql5.com
Парни, как более-менее рандом написать? Чтобы в цикле из примерно 100000-1000000 проходов хоть явного псевдо не было...
 
Sergey Gridnev #:
GetTickCount() должен и в тестер разные значения выдавать, если метаквоты не накосячили как обычно.

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

Как накосячили ?

void OnInit() {

tick=GetTickCount(); // должен давать близкие (вообще идентичные) значения в проходах оптимизатора.

}

вот если он сильно разный и действительно в оптимизаторе показывает "кол-во тиков (мсек) со старта запустившей программы" - вот это будет косяк.

 
Igor Makanu #:

используйте СБ, в ней все давно есть:

https://www.mql5.com/ru/forum/324066#comment_13500222

А что "всё" в ней есть? Мне, к примеру, потребовались 128-битные случайные числа и 48-битные. И то и то получаю с разных объектов у которых один базовый класс. Кроме того - я знаю что делает мой ГПСЧ, а что делает метаквотовская реализация можно только предполагать.
 
Maxim Kuznetsov #:

Как накосячили ?

void OnInit() {

tick=GetTickCount(); // должен давать близкие (вообще идентичные) значения в проходах оптимизатора.

}

вот если он сильно разный и действительно в оптимизаторе показывает "кол-во тиков (мсек) со старта запустившей программы" - вот это будет косяк.

Для инициализации нормального ГПСЧ достаточно, чтобы посев хотя бы на 1 различался. А это GetTickCount() обеспечивает. 
Причина обращения: