rand n´a d´aléatoire que le nom, il s´agit en réalité d´une liste d´éléments finis préécrite, composée d´éléments différents pour simuler un truc aléatoire.
La fonction srand permet de fixer le début de la liste utilisé par ton programme, permettant ainsi de ne pas commencer toujours au même endroit, c´est pour cela que lorsque tu omets d´écrire srand, tu obtiens les mêmes valeur à chaque fois.
Un exemple : si ta liste est :
1,6,98465,51,674,1258,...
Tu peux grâce à srand, dire à ton ordi que la liste commence à 674 pour l´exécution de ce programme.
Quand à time(NULL) qui renvoie la date en milliseconde, cela sert à obtnir une valeur pour srand, en l´occurence la date courante...