forked from airat77786/MQL5Book
131 lines
4.5 KiB
MQL5
131 lines
4.5 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| LibRandTest.mq5 |
| |||
//| Copyright 2021-2022, MetaQuotes Ltd. |
| |||
//| https://www.mql5.com |
| |||
//+------------------------------------------------------------------+
| |||
#property script_show_inputs
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Inputs |
| |||
//+------------------------------------------------------------------+
| |||
input int N = 10000;
| |||
input double Mean = 0.0;
| |||
input double Sigma = 1.0;
| |||
input double HistogramStep = 0.5;
| |||
input int RandomSeed = 0;
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Includes |
| |||
//+------------------------------------------------------------------+
| |||
#include "..\..\Include\LibRand.mqh"
| |||
#include "..\..\Include\MapArray.mqh"
| |||
#include "..\..\Include\QuickSortStructT.mqh"
| |||
| |||
#define COMMA ,
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Special map with sorting |
| |||
//+------------------------------------------------------------------+
| |||
template<typename K,typename V>
| |||
class MyMapArray: public MapArray<K,V>
| |||
{
| |||
public:
| |||
void sort()
| |||
{
| |||
SORT_STRUCT(Pair<K COMMA V>, array, key);
| |||
}
| |||
};
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Script program start function |
| |||
//+------------------------------------------------------------------+
| |||
void OnStart()
| |||
{
| |||
const uint seed = RandomSeed ? RandomSeed : GetTickCount();
| |||
Print("Random seed: ", seed);
| |||
MathSrand(seed);
| |||
| |||
// call 2 library functions
| |||
Print("Random HEX-string: ", RandomString(30, StringPatternDigit() + "ABCDEF"));
| |||
Print("Random strings:");
| |||
string text[];
| |||
RandomStrings(text, 5, 10, 20);
| |||
ArrayPrint(text);
| |||
| |||
// call another library function
| |||
double x[];
| |||
PseudoNormalArray(x, N, Mean, Sigma);
| |||
| |||
// now check distribution of generated values
| |||
Print("Random pseudo-gaussian histogram: ");
| |||
| |||
// use 'long' as type for keys because 'int' is used for direct access by index
| |||
MyMapArray<long,int> map;
| |||
| |||
for(int i = 0; i < N; ++i)
| |||
{
| |||
map.inc((long)MathRound(x[i] / HistogramStep));
| |||
}
| |||
map.sort(); // sort by key value for display
| |||
| |||
int max = 0; // use max value for scaling
| |||
for(int i = 0; i < map.getSize(); ++i)
| |||
{
| |||
max = fmax(max, map.getValue(i));
| |||
}
| |||
| |||
const double scale = fmax(max / 80, 1); // max 80 chars in histogram
| |||
| |||
for(int i = 0; i < map.getSize(); ++i) // print histogram
| |||
{
| |||
const int p = (int)MathRound(map.getValue(i) / scale);
| |||
string filler;
| |||
StringInit(filler, p, '*');
| |||
Print(StringFormat("%+.2f (%4d)",
| |||
map.getKey(i) * HistogramStep, map.getValue(i)), " ", filler);
| |||
}
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
/*
| |||
| |||
Random seed: 8859858
| |||
Random HEX-string: E58B125BCCDA67ABAB2F1C6D6EC677
| |||
Random strings:
| |||
"K4ZOpdIy5yxq4ble2" "NxTrVRl6q5j3Hr2FY" "6qxRdDzjp3WNA8xV" "UlOPYinnGd36" "6OCmde6rvErGB3wG"
| |||
Random pseudo-gaussian histogram:
| |||
-9.50 ( 2)
| |||
-8.50 ( 1)
| |||
-8.00 ( 1)
| |||
-7.00 ( 1)
| |||
-6.50 ( 5)
| |||
-6.00 ( 10) *
| |||
-5.50 ( 10) *
| |||
-5.00 ( 24) *
| |||
-4.50 ( 28) **
| |||
-4.00 ( 50) ***
| |||
-3.50 ( 100) ******
| |||
-3.00 ( 195) ***********
| |||
-2.50 ( 272) ***************
| |||
-2.00 ( 510) ****************************
| |||
-1.50 ( 751) ******************************************
| |||
-1.00 (1029) *********************************************************
| |||
-0.50 (1288) ************************************************************************
| |||
+0.00 (1457) *********************************************************************************
| |||
+0.50 (1263) **********************************************************************
| |||
+1.00 (1060) ***********************************************************
| |||
+1.50 ( 772) *******************************************
| |||
+2.00 ( 480) ***************************
| |||
+2.50 ( 280) ****************
| |||
+3.00 ( 172) **********
| |||
+3.50 ( 112) ******
| |||
+4.00 ( 52) ***
| |||
+4.50 ( 43) **
| |||
+5.00 ( 10) *
| |||
+5.50 ( 8)
| |||
+6.00 ( 8)
| |||
+6.50 ( 2)
| |||
+7.00 ( 3)
| |||
+7.50 ( 1)
| |||
| |||
*/
| |||
//+------------------------------------------------------------------+
|