Yo leería el archivo en un
array (función
file, ejem, ejem) y luego iría quitando elementos del
array aleatoriamente (quizás con
array_pop y
shuffle). De la otra manera, en caso de un
array muy grande, si se mantiene el
array original pero se va cargando en otro
array los elementos ya usados, cuantos más elementos se hayan usado, menor será la probabilidad de usar uno no usado (porque el índice aleatorio estaría en el rango de 1 a n, siendo n el tamaño del array original) de modo que podría tardar demasiado. Por ejemplo, en el caso (extremo, desde luego) de un
array de un millón de elementos, siendo que se han usado novecientos noventa y nueve mil novecientos noventa y nueve, sólo quedará un elemento por usar; pero la probabilidad de generarlo aleatoriamente sería de una en un millón. Es decir, que se desperdiciarían un montón de ciclos de ejecución. ¡Suerte!