set.seed() en R: para qué sirve y por qué deberías usarla

set.seed() fija el punto de partida del generador de números aleatorios de R. A partir de ahí, cualquier proceso con azar dará siempre el mismo resultado.

Ejemplo simple

Sin ella, cada ejecución da algo distinto:

sample(1:100, 5)
sample(1:100, 5)

Con ella, no:

set.seed(123)
sample(1:100, 5)

set.seed(123)
sample(1:100, 5)

Las dos llamadas devuelven exactamente los mismos cinco números. Y en cualquier ordenador.

El número que le pongas da igual —123, 42, 2026—, solo tiene que ser el mismo para obtener el mismo resultado.

Por qué importa

Si tu análisis usa azar y no fijas la semilla, nadie puede reproducir tus resultados. Ni siquiera tú dentro de un mes.

Afecta a más cosas de las que parece: dividir datos en entrenamiento y test, validación cruzada, bootstrap, inicialización de modelos, simulaciones… todo eso usa números aleatorios por dentro.

Dónde ponerla

Al principio del script, una sola vez, antes de cualquier proceso aleatorio:

set.seed(2026)

# a partir de aquí, todo reproducible
indices <- sample(1:150, 105)
entrenamiento <- iris[indices, ]
test <- iris[-indices, ]

Ojo con esto: la semilla se consume. Si ejecutas dos veces seguidas sample() después de un solo set.seed(), la segunda llamada dará un resultado distinto de la primera. Es correcto → lo reproducible es la secuencia completa, no cada llamada por separado.

Ejemplo algo más completo

Un error común: poner set.seed() dentro de un bucle.

# Mal: las 5 muestras salen idénticas
for (i in 1:5) {
  set.seed(123)
  print(mean(sample(1:100, 10)))
}

# Bien: una semilla al principio, muestras distintas pero reproducibles
set.seed(123)
for (i in 1:5) {
  print(mean(sample(1:100, 10)))
}

En el primer caso reinicias el generador en cada vuelta y siempre sacas la misma muestra, lo que arruina cualquier simulación.

Más sobre el muestreo en sí, en el artículo de sample().