If the difference in the number of years is less than about 90 you can use the $RANDOM variable in bash to give you an offset in number of days and use the limited ability of the date command to do the calculation.
#!/bin/bash s=$(date +%s -d "1/1/$1") # start in seconds since 1 Jan 1970 e=$(date +%s -d "1/1/$(($2+1))") # start of end year +1 in seconds days=$(((e-s)/(24*3600))) # number of days from start to end factor=$((32767/$days)) # RANDOM is 0 to 32767. See how many toobig=$(($factor*$days)) # exact multiples of days. # if RANDOM is too large, draw again for((i=0;i<${3:-1};i++)) # produce $3 random dates do r=$RANDOM # find a random number < toobig while [[(( r >= toobig ]])) # if toobig, then loop. do r=$RANDOM done offset=$(($r/$factor)) # get (0,days) from (0,factor*days) # output horrible day/month/year for N days past start date date -d "$offset days 1/1/$1" +%d/%m/%Y done The inner loop to select the random number attempts to correct for bias. If a random number source could give you 0, 1, 2, 3, 4, 5, 6, 7, 8 or 9 equally and you want a random number between 0 and 3 inclusive, then if you get 0 or 1 from the source you report 0, if you get 2 or 3, then you report 1, if you get 4 or 5 you report 2, if you get 6 or 7 you report 3, and if you get 8 or 9 you ignore this number from the source.