Like you said, the numbers generated are pseudo-random, not true random. However, the randomness is extremely high in any modern programming language, so close to random that a human really can't tell it apart.
From your formula above, there should be mathematically between 1% and 5% chance to miss (ignoring the blind state, is that why you're missing 3-5 times in a row?).
Go ahead and paste this code into your browser's dev tools (press F12 to open the console in most browsers) and let me know what your results are:
Code:
let missCountLow = 0;
let missCountHigh = 0;
const missChanceLow = 100; // 1%
const missChanceHigh = 500; // 5%
const trials = 1000000;
for (let i = 0; i < trials ; i++) {
const missRandom = Math.random() * 10000;
if (missRandom < missChanceLow) missCountLow++;
if (missRandom < missChanceHigh) missCountHigh++;
}
console.log("Actual % miss for estimated 1% chance (1 million trials): ", missCountLow / trials * 100);
console.log("Actual % miss for estimated 5% chance (1 million trials): ", missCountHigh / trials * 100);
For me, on Firefox, I got 0.98% for the first one and 5.01% for the second one. Close enough beyond the ability of a human to anecdotally tell it was imperfect.
If what you're seeing in your testing experience is contradictory to the hard numbers and the math, then either:
1. What TWings said about the perception of randomness by a human vs reality. For interesting reading, look up how Apple had to change their shuffle formula to actually be
not random after people complained they got the same song twice in a row (which happens in random)
2. There's something else in the formula besides what you've shared that's influencing the results