Из книги:
Выберите случайную строку с помощью смещения
Еще один способ, который позволяет избежать проблем, найденных в предыдущих альтернативах, - это подсчет строк в наборе данных и возврат случайное число между 0 и счетчиком. Затем используйте этот номер в качестве смещения при запросе набора данных
<?php
$rand = "SELECT ROUND(RAND() * (SELECT COUNT(*) FROM Bugs))";
$offset = $pdo->query($rand)->fetch(PDO::FETCH_ASSOC);
$sql = "SELECT * FROM Bugs LIMIT 1 OFFSET :offset";
$stmt = $pdo->prepare($sql);
$stmt->execute( $offset );
$rand_bug = $stmt->fetch();
Используйте это решение, если вы не можете принимать смежные значения ключа, и вам нужно убедиться, что каждая строка имеет даже шанс быть выбранным.