With 0-indexed arrays, and stopping the loop at the last non-trivial random selection, we have
for x = n to 2 step -1:
swap A[x-1], A[uniform_random(0 inclusive to x exclusive)]
vs
for x = 0 to n-2 step 1:
swap A[x], A[uniform_random(x inclusive to n exclusive)]
which would probably be implemented as
for x = 0 to n-2 step 1:
swap A[x], A[x + uniform_random(0 inclusive to n-x exclusive)]
So the forward loop has at least as much complexity.
I would claim that the simplest version is looping backwards in a 1-indexed environment (i.e. 1-indexed arrays and random number generation):
for x = n to 2 step -1:
swap A[x], A[uniform_random(1 inclusive to x inclusive)]
There are various other variants possible: e.g. in the first example, we could loop x = n-1 to 1 step -1
; in the second example, we could use two loop variables instead of one; etc.