MathSrand

Establece el estado inicial para generar una serie de números enteros pseudoaleatorios.

void  MathSrand(
   int  seed      // número de inicialización
   );

Parámetros

seed

[in]  Número inicial para una fila de números aleatorios.

Valor devuelto

No hay valor devuelto.

Nota

La función MathRand() sirve para generar una secuencia de números pseudoaleatorios. La llamada de MathSrand() con un cierto número inicializador permite recibir siempre la misma secuencia de números pseudoaleatorios.

Para garantizar la recepción de una secuencia irrepetible, utilice la llamada de MathSrand(GetTickCount()), ya que el valor GetTickCount() se aumenta desde el arranque del sistema operativo y no se repite durante 49 días hasta que se llene el contador incorporado de milisegundos. El uso de MathSrand(TimeCurrent()) no vale porque la función TimeCurrent() devuelve la hora de llegada del último tick que puede ser intacto durante bastante tiempo, por ejemplo durante el fin de semana.

La inicialización del generador de números pseudoaleatorios con el uso de MathSrand() para los indicadores y EAs es mejor hacer dentro del manejador OnInit(). Esto permite evitar los posteriores numerosos arranques del generador en OnTick() y OnCalculate().

En vez de la función MathSrand() se puede usar la función srand().

Ejemplo:

#property description "El indicador demuestra el teorema del límite central que indica:"
#property description "La suma de un número suficientemente grande de variables aleatorias e independientes, "
#property description "que tienen aproximadamente las mismas dimensiones (ninguno de los sumando es dominante,"
#property description "sin ejercer ninguna contribución determinante en la suma), «se aproxima bien» a una distribución normal."
 
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- propiedades de construcción gráfica
#property indicator_label1  "Label"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrRoyalBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  5
//--- variable input
input int      sample_number=10;
//--- búfer indicador para dibujar la distribución
double         LabelBuffer[];
//--- contador de ticks
double         ticks_counter;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- enlace del array con el búfer de indicador
   SetIndexBuffer(0,LabelBuffer,INDICATOR_DATA);
//--- damos la vuelta al búfer de indicador desde el presente hasta el pasado
   ArraySetAsSeries(LabelBuffer,true);
//--- inicializamos el generador de números aleatorios
   MathSrand(GetTickCount());
//--- inicializamos el contador de ticks
   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[])
  {
//--- con el contador cero ponemos el búfer de indicador a cero
   if(ticks_counter==0) ArrayInitialize(LabelBuffer,0);
//--- aumentamos el contador
   ticks_counter++;
//--- hace falta poner a cero periódicamente el contador de ticks para reavivar la distribución
   if(ticks_counter>100)
     {
      Print("Tras poner a cero los valores del indicador, volvemos a rellenar las celdas");
      ticks_counter=0;
     }
//--- obtenemos la muestra de valores aleatorios como la suma de tres números de 0 a 7
   for(int i=0;i<sample_number;i++)
     {
      //--- cálculo del índice de la celda en la que se coloca el número aleatorio como la suma de otros tres
      int rand_index=0;
      //--- obtenemos tres números aleatorios de 0 a 7
      for(int k=0;k<3;k++)
        {
         //--- el resto de la división por 7 devolverá un valor de 0 a 6
         rand_index+=MathRand()%7;
        }
      //--- aumentamos a uno el valor en la celda con el número rand_index
      LabelBuffer[rand_index]++;
     }
//--- salimos del manejador OnCalculate()
   return(rates_total);
  }