Existe un algoritmo estándar para ello:
- Dejemos que $S$ (la entrada seleccionada) sea la primera entrada.
- Si hay una segunda entrada, genera un número aleatorio $x$ entre 0 y 1. Si $x\lt \frac12 $ descartar la selección anterior y dejar que $S$ sea la segunda entrada en su lugar.
- Si hay una tercera entrada, genera un número aleatorio $x$ entre 0 y 1. Si $x\lt \frac13$ descartar la selección anterior y dejar que $S$ sea la tercera entrada en su lugar.
(Repetir de forma similar hasta llegar a la última entrada; el $i$ La segunda entrada debe ser seleccionada con probabilidad $\frac1i$ , sustituyendo a lo que se había seleccionado anteriormente, y que, en caso contrario, debería descartarse. )
La entrada seleccionada es la que queda en $S$ una vez finalizado este procedimiento.
Pseudocódigo:
i := 0
while (another entry remains) do:
E := (read next entry)
i := i + 1
x := random (0,1)
if x < 1/i do:
S := E
end;
end;
(the selected entry is now in S)
Una sencilla prueba de inducción establece que si hay $n$ entradas, entonces cada una es seleccionada con una probabilidad exacta $\frac1n $ . Porque si eso es cierto en el primer $n-1$ entradas, entonces cada una de ellas se selecciona con probabilidad $\frac1 {n-1}$ antes del paso final. Entonces se selecciona la entrada final con probabilidad $\frac1n $ si no se selecciona la última entrada, entonces la entrada anterior ya está en $S$ ha sido seleccionado con una probabilidad total $\frac1 {n-1}\frac {n-1}n$ .
Se trata de un algoritmo muy conocido entre los programadores informáticos; si se busca en Internet "seleccionar una línea al azar sin contar las líneas" se encontrarán muchas discusiones sobre el problema y su solución. )