Русский

Справочник MQL4 Математические функции MathSrand

MathSrand

Устанавливает начальное состояние для генерации ряда псевдослучайных целых чисел.

void  MathSrand(
   int  seed      // инициализирующее число
   );

Параметры

seed

[in]  Начальное число для ряда случайных чисел.

Возвращаемое значение

Нет возвращаемого значения.

Примечание

Функция MathRand() предназначена для генерации последовательности псевдослучайных чисел. Вызов MathSrand() с определенным инициализирующим числом позволяет получать всегда одну и ту же последовательность псевдослучайных чисел.

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

Инициализацию генератора псевдослучайных чисел с помощью MathSrand() для индикаторов и экспертов лучше всего делать в обработчике OnInit(), это избавит от последующих многократных перезапусков генератора в OnTick() и OnCalculate().

Вместо функции MathSrand() можно использовать функцию srand().

Пример:

#property description "Индикатор демонстрирует центральную предельную  теорему, которая гласит:"
#property description "Сумма достаточно большого количества слабо зависимых случайных величин, "
#property description "имеющих примерно одинаковые масштабы (ни одно из слагаемых не доминирует,"
#property description "не вносит в сумму определяющего вклада), имеет распределение, близкое к нормальному."
 
#property indicator_separate_window
#property indicator_buffers 1
//--- свойства графического построения
#property indicator_label1  "Label"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrRoyalBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  5
//--- input переменная
input int      sample_number=10;
//--- индикаторный буфер для отрисовки распределения
double         LabelBuffer[];
//--- счетчик тиков
double         ticks_counter;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- связывание массива и индикаторного буфера
   SetIndexBuffer(0,LabelBuffer,INDICATOR_DATA);
//--- развернем индикаторный буфер из настоящего в прошлое
   ArraySetAsSeries(LabelBuffer,true);
//--- инициализируем генератор случайных чисел
   MathSrand(GetTickCount());
//--- инициализируем счетчик тиков
   ticks_counter=0;
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//--- при нулевом счетчике обнулим буфер индикатора
   if(ticks_counter==0) ArrayInitialize(LabelBuffer,0);
//--- увеличим счетчик
   ticks_counter++;
//--- нужно периодически сбрасывать счетчик тиков, чтобы оживлять распределение
   if(ticks_counter>100)
     {
      Print("Обнулили значения индикатора, начнем заполнять ячейки снова");
      ticks_counter=0;
     }
//--- получим выборку случайных значений, как сумму трех чисел от 0 до 7
   for(int i=0;i<sample_number;i++)
     {
      //--- вычисление индекса ячейки, куда выпадет случайное число как сумма трех других
      int rand_index=0;
      //--- получим три случайных числа от 0 до 7
      for(int k=0;k<3;k++)
        {
         //--- остаток от деления на 7 вернет значение от 0 до 6
         rand_index+=MathRand()%7;
        }
      //--- увеличим на единицу значение в ячейке с номером rand_index
      LabelBuffer[rand_index]++;
     }
//--- выход из обработчика OnCalculate()
   return(rates_total);
  }