Si tu veux mon avis personnel (intuitif), il arrive que ton sprite dépasse de l'écran lorsque tu l'affiche, d'où l'overflow. Tu peux corriger ça par exempleen faisant un coup de modulo. (soit arithémtiquement à la main, soit avec des If X >= .. then 1->X ou if X >= .. then (X-..)->X )
Si t'affiche ton sprtie en fin de boucle ( tu affiche le sprite à la main ou avec une lib ?), c'est possible que le 'curseur' revienne en début de boucle suivante
Pour le savoir, il y a une méthode simple: juste après que ça ait planté, vérifie (écran de calcul) que les valeurs de X et Y soient bonnes ( après, ça dépend si t'affiche en pixel ou en point)
Ha sinon, je peux pas m'empécher:
randInt(1,4)->E
If E=1:Then:Y+16->Y:End
If E=2:Then:Y-16->Y:End
If E=3:Then:X+16->X:End
If E=4:Then:X-16->X:End
gagnera à devenir:
Y+16randInt(-1,1)->Y:End
X+16randInt(-1,1)->X:End
mais tu aura également le déplacement nul et le déplacement en diagonal.
Pour éviter le déplacement nul, on peut toujours faire un truc comme:
16*(2randInt(0,1)-1)
On peut également éviter le déplacement en diagonal, soit au prix d'un If (c'est lent un If

), soit en bricolant encore un peu plus, mais en alourdissant le code (je fais une version lisible, c'est optimisable):
randInt(1,4)->E
Y + (1-Int(E/3))*16*(2*E-3) ->Y
X + Int(E/3)*16*(2E-7) -> Y
ce qui revient strictement à ton code au niveau (distribution des) possibilitées. (équiréparti gauche/droite/haut/bas)
Un rapide commentaire, mais j'ai la flemme:
Int(E/3) vaut 1 lorsque E vaut 3 ou 4 et 0 lorsque E vaut 1 ou 2. Je reprends presque ton organisation:
E=1: Y - 16 -> Y,
E=2: Y+16->Y ,
E=3: X-16->X,
E=4: X+16->X
(1-Int(E/3)) vaut donc 0 pour E=3 ou 4 et 1 pour E=1,2.
En mettant respectivement ces termes en facteur des expression, on incrémente soit X soit Y mais pas les deux à la fois.
Le reste, c'est du bricolage our obtenir à chaque fois le couple (-16,+16) à partir d'un couple (1,2) ou (3,4)