MQL5Book/Scripts/p7/LibRandTest.mq5
super.admin 1c8e83ce31 convert
2025-05-30 16:09:41 +02:00

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)
*/
//+------------------------------------------------------------------+