MathSrand

Define o ponto inicial para geração de uma série de inteiros pseudo-aleatórios.

void  MathSrand(
   int  seed      // número de inicialização
   );

Parâmetros

seed

[in]  Número inicial para a seqüência de números aleatórios.

Valor do Retorno

Sem valor de retorno.

Observação

A função MathRand() é usada para gerar uma seqüência de números pseudo-aleatórios. Chamar MathSrand() com um certo número de inicialização permite produzir sempre a mesma seqüência de números pseudo-aleatórios.

Para garantir o recebimento de uma seqüência não recorrente, use a chamada de MathSrand(GetTickCount()), uma vez que o valor de GetTickCount() aumenta a partir do momento do início do sistema operativo e não se repete dentro de 49 dias, quando o contador built-in de milissegundos transborda. O uso do MathSrand(TimeCurrent()) não é adequado, porque a função TimeCurrent() retorna a hora do último tick, que pode não se alterar por um longo tempo, por exemplo, nos finais de semana.

A inicialização do gerador de números aleatórios usando MathSrand() para indicadores e Expert Advisors é melhor realizada no handler OnInit(); isso evita os seguidos reinícios múltiplos caso a inicialização do gerador fosse colocada em OnTick() ou OnCalculate().

Ao invés da função MathSrand(), você pode usar a função srand().

Exemplo:

#property description "O indicador mostra o teorema do limite central, que:"
#property description "A soma de um número suficientemente grande de variáveis aleatórias fracamente dependentes, "
#property description "A soma de um número suficientemente grande de variáveis aleatórias fracamente dependentes,"
#property description "ou faz uma contribuição determinante para a soma), tem uma distribuição próxima do normal."
 
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- Propriedades da construção gráfica
#property indicator_label1  "Label"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrRoyalBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  5
//--- Uma variável de entrada
input int      sample_number=10;
//--- Um buffer do indicador para desenhar a distribuição
double         LabelBuffer[];
//--- Um contador de ticks
double         ticks_counter;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador customizado                 |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- Ligando um array e um buffer de indicador
   SetIndexBuffer(0,LabelBuffer,INDICATOR_DATA);
//--- transformar o buffer do indicador em torno do presente para o passado
   ArraySetAsSeries(LabelBuffer,true);
//--- Inicializar o gerador de números aleatórios
   MathSrand(GetTickCount());
//--- Inicializar o contador de ticks
   ticks_counter=0;
  }
//+------------------------------------------------------------------+
//| Função de iteração do indicador customizado                      |
//+------------------------------------------------------------------+
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[])
  {
//--- Para um contador zero, reinicie o buffer do indicador
   if(ticks_counter==0) ArrayInitialize(LabelBuffer,0);
//--- Aumentar o contador
   ticks_counter++;
//--- Devemos periodicamente redefinir os contadores, para reviver a distribuição
   if(ticks_counter>100)
     {
      Print("Reajustamos os valores dos indicadores, vamos começar a preencher as células mais uma vez");
      ticks_counter=0;
     }
//--- Obter uma amostra de valores aleatórios como a soma de três números de 0 a 7
   for(int i=0;i<sample_number;i++)
     {
      //--- Cálculo do índice da célula, onde o número aleatório cai como a soma de outros três números
      int rand_index=0;
      //--- Obter três números aleatórios de 0 a 7
      for(int k=0;k<3;k++)
        {
         //--- Um restante na divisão por 7 retornará um valor de 0 a 6
         rand_index+=MathRand()%7;
        }
      //--- Aumentar o valor no número da célula rand_index por 1
      LabelBuffer[rand_index]++;
     }
//--- Sair do manipulador OnCalculate()
   return(rates_total);
  }