I'll attempt to improve this for you, untested btw
on join:
while player is online: # Will have a constant loop until they leave, waiting the time specified below
wait 1 second
world of player isn't "nether" or "the_end"
loop all zombies:
abs((x-coordinate of player)-(x-coordinate of loop-value)) < 50 # The radius, absolute value of player's x - abs of zombie's x
# EX: abs(50-60) would be abs(-10) which is 10 distance
abs((z-coordinate of player)-(z-coordinate of loop-value)) < 50 # same for z value
# The zombie is within 50 blocks
set path targets of loop-value to player
apply speed 3 without any particles to loop-value for 16 seconds
set {_} to random number between 1 and 100 # Using "chance of" with skript is a horrible idea, instead check if {_} is between 1 and x
if {_} is between 1 and 2: # 2% start chance, edit if you want, this triggers every second so would recommend this or below
# Not required to be an integer, 2.63 is valid for example. Anything more than 2 decimals is ignored.
summon 1 zombie at location of loop-value #Multiply thingie