A true random number must be derived from a really random value (e. g. microphone noise), not from a digital formula. The randomness in the MQL4 is similar to the one used in Windows:
For the first:
random_number=fractional part of (9821 * r + 0.211327) where r = .5 (a seed)
For the next:
random_number=fractional part of (9821 * r + 0.211327),
What type of pseudorandom algorithm does the
uses, and how random is it?
Secondly,is there any way to obtain true random numbers in MQL4 code?
- MT4 uses the same as most computers.
- Most RNGs use 32 bits, i.e. returns a double fraction [0..1) MT4 uses something much simpler and return an int [0..32767] and therefor must less random IMO.
- While there is no true random numbers (computationally generated,) you can make the existing one much better (more statistically independent groups) with a simple function:Not compiled, not tested.
#define RANDOM_ARRAY_SIZE 100 #define MATHRANDOM_LIMIT 32768 // Last=32767 int randomArray[RANDOM_ARRAY_SIZE]; void OnInitRandom(int seed=1){ MathSrad(seed); for(int i=0; i < RANDOM_ARRAY_SIZE; i++) randomArray[i] = MathRand(); } double RandomFraction(){ // Returns double [0..1) double d = MathRand(); int i = d * RANDOM_ARRAY_SIZE / MATHRANDOM_LIMIT; d = randomArray[i] / MATHRANDOM_LIMIT; randomArray[i] = MathRand(); return(d); } int RandomLinear(int max, int min=0){ return(RandomFraction()*(max-min+1)+min); } // Other probability distributions tbd
Not compiled, not tested.
- MT4 uses the same as most computers.
- Most RNGs use 32 bits, i.e. returns a double fraction [0..1) MT4 uses something much simpler and return an int [0..32767] and therefor must less random IMO.
- While there is no true random numbers (computationally generated,) you can make the existing one much better (more statistically independent groups) with a simple function:Not compiled, not tested. Not compiled, not tested.
Oh thanks, i didnt noticed there was a seeded version of it
MathSrand( int seed)
Acutally i think this one is much simpler than the one you wrote in your post:
MathSrand(Time[0]);
And more statistically independent since it counts time in seconds and it will not recurr :)
Acutally i think this one is much simpler than the one you wrote in your post:
And more statistically independent since it counts time in seconds and it will not recurr :)
Seeding has nothing to do with my post. MathRand returns a set of numbers. After it returns the total set, which depends on the (9821 * r + 0.211327) the set starts again. Seeding just sets where in the set it begins. If you want to use Srand(Time[0] ) or my OnInitRandom( Time[0] ) you'll get a different set of numbers.
My post was to decrease the correlations of groups of calls per your "true random" question.
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
What type of pseudorandom algorithm does the
MathRand( )uses, and how random is it?
Secondly,is there any way to obtain true random numbers in MQL4 code?