Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1990

 
Mikhail Tkachev #:
Прошу помощь у сообщества...
Почему MathRand() дает повторяющиеся значения ?

MathRand()   : Перед первым вызовом функции необходимо использовать функцию MathSrand, чтобы перевести генератор псевдослучайных чисел в начальное состояние.
MathSrand()  : Для гарантированного получения неповторяющейся последовательности используйте вызов MathSrand(GetTickCount()).

Тестировал советник со случайным входом. Результаты повторялись.Решил проверить в скрипте, как работает MathRand(). Значения повторяются...

Вывод во вкладку "Эксперты" терминала :

2022.07.08 10:05:58.162 Script checkMathRand EURUSD,H4: removed

2022.07.08 10:05:58.162 checkMathRand EURUSD,H4: uninit reason 0

2022.07.08 10:05:58.162 checkMathRand EURUSD,H4: checkMathRand.mq4:34 OnStart : Конец

2022.07.08 10:05:58.162 checkMathRand EURUSD,H4: Цикл : 5 ; 14161 ; 28429 ; 16098 ; 9335 ; 1512

2022.07.08 10:05:58.162 checkMathRand EURUSD,H4: Цикл : 4 ; 14161 ; 28429 ; 16098 ; 9335 ; 1512

2022.07.08 10:05:58.162 checkMathRand EURUSD,H4: Цикл : 3 ; 14161 ; 28429 ; 16098 ; 9335 ; 1512

2022.07.08 10:05:58.162 checkMathRand EURUSD,H4: Цикл : 2 ; 14161 ; 28429 ; 16098 ; 9335 ; 1512

2022.07.08 10:05:58.162 checkMathRand EURUSD,H4: Цикл : 1 ; 14161 ; 28429 ; 16098 ; 9335 ; 1512

2022.07.08 10:05:58.162 checkMathRand EURUSD,H4: checkMathRand.mq4:19 OnStart : Начало

2022.07.08 10:05:58.162 checkMathRand EURUSD,H4: initialized

2022.07.08 10:05:58.146 Script checkMathRand EURUSD,H4: loaded successfully




Между вызовами MathSrand проходит мало времени, поэтому генератор инициализируется одним и тем же числом.

А вообще, обычно в OnInit() вызывают MathSrand.

 
Mikhail Tkachev #:
Прошу помощь у сообщества...
Почему MathRand() дает повторяющиеся значения ?

MathRand()   : Перед первым вызовом функции необходимо использовать функцию MathSrand, чтобы перевести генератор псевдослучайных чисел в начальное состояние.
MathSrand()  : Для гарантированного получения неповторяющейся последовательности используйте вызов MathSrand(GetTickCount()).

Тестировал советник со случайным входом. Результаты повторялись.Решил проверить в скрипте, как работает MathRand(). Значения повторяются...

Замените GetTickCount() на (int)GetMicrosecondCount()

И вот результат

2022.07.08 10:50:47.866 !!0 (GBPUSD,M1) !!0.mq5:25 OnStart : Начало
2022.07.08 10:50:47.866 !!0 (GBPUSD,M1) Цикл : 1 ; 1067 ; 18363 ; 12356 ; 12972 ; 13914
2022.07.08 10:50:47.866 !!0 (GBPUSD,M1) Цикл : 2 ; 1106 ; 16272 ; 30118 ; 6820 ; 6617
2022.07.08 10:50:47.866 !!0 (GBPUSD,M1) Цикл : 3 ; 1142 ; 3432 ; 30016 ; 9373 ; 21773
2022.07.08 10:50:47.866 !!0 (GBPUSD,M1) Цикл : 4 ; 1175 ; 12612 ; 12050 ; 20630 ; 26615
2022.07.08 10:50:47.866 !!0 (GBPUSD,M1) Цикл : 5 ; 1204 ; 11044 ; 8987 ; 7824 ; 21142
2022.07.08 10:50:47.866 !!0 (GBPUSD,M1) !!0.mq5:39 OnStart : Конец
 
Mikhail Tkachev #:
Прошу помощь у сообщества...



Из цикла вынесите MathSrand()


void OnStart() {
   string   str1;
   int      val1;
      
      MathSrand(GetTickCount());

      Print(__FILE__+":"+IntegerToString(__LINE__)+" "+__FUNCTION__+" : Начало");
      for (int i=1;i<=5;i++) { 
      
         str1=StringConcatenate("Цикл : ",i);
         //MathSrand(GetTickCount()); // Инициализация неповторяющимся числом

         for (int j=1;j<=5;j++) { 
            val1=MathRand();
            str1=StringConcatenate(str1," ; ",IntegerToString(val1)) ;
         }
         Print(str1);
      }
      Print(__FILE__+":"+IntegerToString(__LINE__)+" "+__FUNCTION__+" : Конец");
}
 
Sergey Gridnev #:


Между вызовами MathSrand проходит мало времени, поэтому генератор инициализируется одним и тем же числом.

А вообще, обычно в OnInit() вызывают MathSrand.

Спасибо за ответ, Сергей !
В эксперте я так и делал вызов  MathSrand в OnInit(). И там между вызовами проходили секунды. А  GetTickCount() считает миллисекунды...

P.S. В скрипте, действительно инициализируется одним значением,  GetTickCount() не успевает измениться)
 
PapaYozh #:


Из цикла вынесите MathSrand()


Спасибо за ответ, PapaYozh)
В скрипте помогло.
А что делать в эксперте ? Там  MathSrand() в OnInit() вызывается. И при этом одинаковые значения...

 
Alexey Viktorov #:

Замените GetTickCount() на (int)GetMicrosecondCount()

И вот результат

Алексей, спасибо за ответ, помогло)
Не знал про такую функцию

 
Tretyakov Rostyslav #:

Кнопку "Все" нажимал?

Спасибо!
 
Mikhail Tkachev #:

Алексей, спасибо за ответ, помогло)
Не знал про такую функцию

По хорошему, не обязательно ставить GetMicrosecondCount(), можно поставить случайное число

    srand(rand());

и будет отличный результат.

 
Alexey Viktorov #:

По хорошему, не обязательно ставить GetMicrosecondCount(), можно поставить случайное число

и будет отличный результат.

Спасибо, отличная конструкция, я не додумался)

 
Alexey Viktorov #:

По хорошему, не обязательно ставить GetMicrosecondCount(), можно поставить случайное число

и будет отличный результат.

при каждом запуске будет повторяться результат

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