112 lines
5.0 KiB
Markdown
112 lines
5.0 KiB
Markdown
# MathSrand
|
||
|
||
Sets the starting point for generating a series of pseudorandom integers.
|
||
|
||
```
|
||
void MathSrand(
|
||
int seed // initializing number
|
||
);
|
||
|
||
```
|
||
|
||
Parameters
|
||
|
||
seed
|
||
|
||
[in] Starting number for the sequence of random numbers.
|
||
|
||
Return Value
|
||
|
||
No return value.
|
||
|
||
Note
|
||
|
||
The [MathRand()](/en/docs/math/mathrand) function is used for generating a sequence of pseudorandom numbers. Call of MathSrand() with a certain initializing number allows to always produces the same sequence of pseudorandom numbers.
|
||
|
||
To ensure receipt of non-recurring sequence, use the call of MathSrand(GetTickCount()), since the value of [GetTickCount()](/en/docs/common/gettickcount) increases from the moment of the start of the operating system and is not repeated within 49 days, until the built-in counter of milliseconds overflows. Use of MathSrand(TimeCurrent()) is not suitable, because the [TimeCurrent()](/en/docs/dateandtime/timecurrent) function returns the time of the last tick, which can be unchanged for a long time, for example at the weekend.
|
||
|
||
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().
|
||
|
||
Instead of the MathSrand() function you can use the srand() function.
|
||
|
||
Example:
|
||
|
||
```
|
||
#property description "The indicator shows the central limit theorem, which states:"
|
||
#property description "The sum of a sufficiently large number of weakly dependent random variables, "
|
||
#property description "having approximately equal magnitude (none of the summands dominates,"
|
||
#property description "or makes a determining contribution to the sum), has a distribution close to normal."
|
||
|
||
#property indicator_separate_window
|
||
#property indicator_buffers 1
|
||
#property indicator_plots 1
|
||
//--- Properties of the graphical construction
|
||
#property indicator_label1 "Label"
|
||
#property indicator_type1 DRAW_HISTOGRAM
|
||
#property indicator_color1 clrRoyalBlue
|
||
#property indicator_style1 STYLE_SOLID
|
||
#property indicator_width1 5
|
||
//--- An input variable
|
||
input int sample_number=10;
|
||
//--- An indicator buffer to for drawing the distribution
|
||
double LabelBuffer[];
|
||
//--- A counter of ticks
|
||
double ticks_counter;
|
||
//+------------------------------------------------------------------+
|
||
//| Custom indicator initialization function |
|
||
//+------------------------------------------------------------------+
|
||
void OnInit()
|
||
{
|
||
//--- Binding an array and an indicator buffer
|
||
SetIndexBuffer(0,LabelBuffer,INDICATOR_DATA);
|
||
//--- turn the indicator buffer around from the present to the past
|
||
ArraySetAsSeries(LabelBuffer,true);
|
||
//--- Initialize the generator of random numbers
|
||
MathSrand(GetTickCount());
|
||
//--- Initialize the counter of 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[])
|
||
{
|
||
//--- For a zero counter reset the indicator buffer
|
||
if(ticks_counter==0) ArrayInitialize(LabelBuffer,0);
|
||
//--- Increase the counter
|
||
ticks_counter++;
|
||
//--- We should periodically reset the counter ticks, to revive the distribution
|
||
if(ticks_counter>100)
|
||
{
|
||
Print("We've reset the indicator values, let's start filling the cells once again");
|
||
ticks_counter=0;
|
||
}
|
||
//--- Get a sample of random values as the sum of three numbers from 0 to 7
|
||
for(int i=0;i<sample_number;i++)
|
||
{
|
||
//--- Calculation of the index of the cell, where the random number falls as the sum of three other numbers
|
||
int rand_index=0;
|
||
//--- Get three random numbers from 0 to 7
|
||
for(int k=0;k<3;k++)
|
||
{
|
||
//--- A remainder in the division by 7 will return a value from 0 to 6
|
||
rand_index+=MathRand()%7;
|
||
}
|
||
//--- Increase the value in the cell number rand_index by 1
|
||
LabelBuffer[rand_index]++;
|
||
}
|
||
//--- Exit the OnCalculate() handler
|
||
return(rates_total);
|
||
}
|
||
|
||
```
|