The process that I have used in the past is based upon selecting random ROWID's with the range min(ROWID) and max(ROWID).
I used a random number routine to generate a random number between the min and the max and then SELECT the row based upon ROWID. HOWEVER, just because you generate a number does not mean that that ROWID exists. So the SELECT statement was something like "SELECT FIRST 1 ... WHERE ROWID >= myrandonmumber"