Returning random integer from interval based on last result and a seed
I suggest you pick a random permutation on the range $[a,b]$, i.e., a bijective function $\pi:[a,b]\to [a,b]$.  Then, maintain a counter $i$ that starts at $i=a$; at each step, output $\pi(i)$ and then increment $i$ (wrapping around so that $b+1$ becomes $a$).
There are standard methods for generating such a random permutation in the cryptography literature: look up format-preserving encryption.  The seed is the cryptographic key.  You will be able to compute $\pi(i)$ in $O(1)$ time and $O(1)$ space, so this should be very efficient and avoid the need for a lot of storage.
If you insist that the next output should be a function of the previous output, you can let $g(i)=i+1$ (except that $g(b)=a$), then let $f(i)=\pi^{-1}(g(\pi(i))$, where $\pi$ is a random permutation chosen as above.   This will then give you a random cycle that iterates through the elements of $[a,b]$ in a random order.  The outputs are the sequence $f(a),f(f(a)),f(f(f(a))),\dots$.