srand() seeds the RNG with the single argument. It gives it a starting point for faking random numbers. They’re not actually random, but for most purposes it’s really close enough. On a conceptual level, you give the RNG a “seed” number. For every call to rand(), you do crazy stuff to that seed until it looks like a random number and spit it out; that random number is the new seed. Actual implementation may vary. You probably don’t want to call srand() with the same value every time unless you are testing something, as on the same system, it will always give the same sequence from rand().
time(0) returns time in seconds since midnight 1 January 1970 (as long as the system clock is set accurately). This isn’t good enough a seed for security but for most games it is, since very few people would bother to stack randomness in their favor by setting the system clock. This way, you get a different sequence of random numbers depending on what time the srand() function was called.