You can use 3, 4 or whatever you want but is the fastest way with 2 because let's say you are in the loop with a step of 2 first time :( D is the pointer that is going 2 steps and S is the normal pointer.
Case 1)
step 1 :x - D - x - S - x - x ...
step 2 :x - x - x - D - S - x ...
step 3 :x - x - x - x - x - SD ( match)
Case 2)
step 1: x - D - S - x this is the step 2 from case 1 and we can see that this is step 2 and we also have a match
but if you have let's say a 3 step (D should be the pointer that is going 3 steps at a time.)
Case 1)
step 1 : x - D - x - x - S ...
step 2 : x - x - x - x - D - S ...
step 3 : x - x - x - x - x - x - S - D ... ( D is passing S and it needs at least another loop to meet S)
Case 2)
step 1 : x - D - x - S -..
step 2 : x - x - x - x - SD ( match)
case 3)
step 1: x - D - S - ..
step 2: x - x - x - S - D ... ( D is passing S and it needs at least another loop to meet S)
And because of that 2 is better than 3, 4 or whatever you want because all the numbers larger than 2 have a chance of 1/(N-1) to meet for the first time.
Another way to explain is this: For D and S and a step of N if the distance between S and D is N - 1 we have a match ( D goes N steps and S 1 step and than D = S), other way D is passing S so we have a 1/(N-1) chance to meet S and D the first time, and because of that if N = 2 we have 1 / 1 = 100% , if N = 3 we have 1/2 = 50%.
Hope it helped.