Los ordenadores en realidad no pueden generar números aleatorios
Lo que hacen es generar números "pseudoaletorios", es decir, mediante un serie de operaciones matemáticas generan una lista de números que aparentan ser aleatorios.
Esto es lo que hace rand(), devolver una lista pseudoaleatoria. Y se puede comprobar que no es realmente aleatoria porque cada vez que ejecutes el mismo programa donde uses rand(), verás que siempre devuelve la misma secuencia de números que la vez anterior.
rand() genera esa lista a partir de un valor numérico llamado "semilla". Como la "semilla" es siempre la misma, la lista no varía.
Ahí es donde srand() interviene.
srand() puede cambiar la "semilla" y así rand() generará una lista de pseudoaletorios distinta.
Obviamente, cada vez que iniciemos el programa, habría que darle una "semilla" distinta.
Lo habitual es llamar a la función time() para darle como "semilla" el instante de tiempo (fecha y hora) del momento en que se ejecuta el programa.
Así cada vez la semilla será distinta.
Puedes comprobarlo con estos códigos.
Esto generará siempre la misma lista de aleatorios
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
for(int i = 0; i<10; i++)
printf(" %d ", rand());
return 0;
}
Pero añadiendo una srand() al principio para cambiar la semilla, la lista de aleatorios será distinta en cada ejecución:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
srand(time(0)); //Pasamos como semilla el instante actual
for(int i = 0; i<10; i++)
printf(" %d ", rand());
return 0;
}
Mucha más información en
este enlace del curso de C