MathSrand

Consente di impostare il punto di partenza per la generazione di una serie di interi pseudocasuali.

void  MathSrand(
   int  seed      // numero di inizializzazione
   );

Parametri

seme

[in] Il numero di partenza per la sequenza di numeri casuali.

Valore restituito

Nessun valore restituito.

Nota

La funzione MathRand() è usata per generare una sequenza di numeri pseudocasuali. La chiamata di MathSrand() con un certo numero di inizializzazione consente di produrre sempre la stessa sequenza di numeri pseudocasuali.

Per assicurare la ricezione di seuenze non-ricorrenti, utilizzare la chiamata di MathSrand(GetTickCount()), in quanto il valore di GetTickCount() aumenta dal momento di inizio del sistema operativo e non viene ripetuto entro 49 giorni, fino a quando il contatore di millisecondi incorporato, non overflowa. L' uso di MathSrand (TimeCurrent()) non è adatto, poiché TimeCurrent() restituisce il tempo dell'ultimo tick, che può essere invariato per lungo tempo, ad esempio durante il fine settimana.

Initialization of the random number generator using MathSrand() for indicators and Expert Advisors is better performed in the OnInit() handler; it saves you from the following multiple restarts of the generator in OnTick() and OnCalculate().

Al posto della funzione MathSrand() è possibile utilizzare la funzione srand().

Esempio:

#property description "L'indicatore mostra il teorema del limite centrale, che dice:"
#property description "La somma di un numero sufficientemente grande di variabili casuali debolmente dipententi, "
#property description "avente approssimativamente uguale magnitudo (nessuno degli addendi dominanti,"
#property description "o rende un contributo determinante alla somma), ha una distribuzione vicina alla normalità."
 
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- Proprietà della costruzione grafica
#property indicator_label1  "Label"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrRoyalBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  5
//--- Una variabile di input
input int      sample_number=10;
//--- Un buffer indicatore per disegnare la distribuzione
double         LabelBuffer[];
//--- Un contatore di ticks
double         ticks_counter;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato                         |
//+--------------------------------------------------------------------------------+
void OnInit()
  {
//--- Associa un array e un buffer indicatore
   SetIndexBuffer(0,LabelBuffer,INDICATOR_DATA);
//--- porta il buffer indicatore vicino dal presente al passato
   ArraySetAsSeries(LabelBuffer,true);
//--- Inizializza il generatore di numeri casuali
   MathSrand(GetTickCount());
//--- Inizializza il contatore di ticks
   ticks_counter=0;
  }
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato                                |
//+--------------------------------------------------------------------------------+
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[])
  {
//--- Per un contatore zero, resetta il buffer indicatore
   if(ticks_counter==0) ArrayInitialize(LabelBuffer,0);
//--- Incrementa il contatore
   ticks_counter++;
//--- Dobbiamo resettare periodicamente i ticks contatore, per ravvivare la distribuzione
   if(ticks_counter>100)
     {
      Print("Abbiamo resettato i valori dell'indicatore, iniziamo a riempire le celle ancora una volta");
      ticks_counter=0;
     }
//--- Ottiene un campione di valori casuali come somma di tre numeri da 0 a 7
   for(int i=0;i<sample_number;i++)
     {
      //--- Calcola l'indice delle celle, dove il numero casuale cade tra la somma di tre altri numeri
      int rand_index=0;
      //--- Ottiene tre numeri casuali da 0 a 7
      for(int k=0;k<3;k++)
        {
         //--- Il resto della divisione per 7 restituità un valore da 0 a 6
         rand_index+=MathRand()%7;
        }
      //--- Incrementa il valore nel numero della cella rand_index by 1
      LabelBuffer[rand_index]++;
     }
//--- Esce dall'handoler OnCalculate()
   return(rates_total);
  }