Vous devriez l'inverser :
SELECT * FROM infos WHERE category=...
ORDER BY rate DESC, like DESC, RAND();
De cette façon, il trie par taux, puis comme et enfin aléatoire si taux et comme sont égaux.
De plus, votre ORDER BY d'origine avec RAND() ne fonctionne pas car vous utilisez deux clauses ORDER BY.