Right now you use dNum * 1000 + 4000 which is derived from d6 using 10000 possibilities, but it doesn't scale. d4 is 8000 possibilities and maybe it should be
dNum * 1000 + (dNum * 1000) * 0.66) )to have it accurately scale to 10000.
Don't forget though that 10000 was a somewhat arbitrary number when you first picked it.
I had a huge problem which would give me seemingly incorrect random numbers. The Serial Monitor numbers were correct, but the hardware would flash different (extra) numbers.
As said, first this seemed random, and I couldn't figure it out why 8 and 9 would show up on the hardware even though the dNum was set to a max of 6.
After a couple of hours I figured out that it wasn't a coding mistake as much as it was a typo.
The code in itself was okay, but I made two errors. One with eight(); and one with nine();
In both eight() and nine() the if-statement was terminated with a ;
e.g.
void loop()
{
bla bla bla
if (mapChange == 8); <-- it was this semi colon that made it ignore the if-statement
eight();
because it ignored the if-statement the eight(); and nine(); functions were run unconditionally every single time.