Un excellent article traitant de plusieurs cas, du simple au non uniforme avec des lacunes.
http://jan.kneschke.de/projects/mysql/order- par-rand/
Pour la plupart des cas généraux, voici comment procéder :
SELECT name
FROM random AS r1 JOIN
(SELECT CEIL(RAND() *
(SELECT MAX(id)
FROM random)) AS id)
AS r2
WHERE r1.id >= r2.id
ORDER BY r1.id ASC
LIMIT 1
Cela suppose que la distribution des identifiants est égale et qu'il peut y avoir des lacunes dans la liste des identifiants. Voir l'article pour des exemples plus avancés