I know how pseudo random numbers are generated. It starts with a long integer. When the program starts this 'seed' depends on the system clock,.
This seed can be specified by you for if you want the same random sequence (for debugging purposes or other reasons).
RndSeed(number as long) called at the start of a sequence will always result in the same random sequence.
At each call the seed is multiplied by a large number and the upper overflow bits are thrown away. The number is converted to the requested range before being returned.
The seed is updated by this process to be ready for the next call. I presume that Rnd(min, max+1) uses this method. If an outsider doesn't know the seed, the randomness is unpredictable (but not random since each result is part of a fixed number sequence). That is why secure random number generators make this predicting task much harder.
In my academic career, I have rarely needed an NON-pseudo random number generator. But such situations exist. In those cases, you have to use something that is truly random. I once used the time between key presses as a seed before making each Rnd() call. [Although, technically, if one were to know the neural/muscular processes leading to time between keypresses, the sequence would still be called pseudo-random]