why is it when i call srand() at 2 very different points it cause numbers to not be random? Once i remove one of them it goes back to normal.
It depends on how you call it. The purpose of srand()
is to seed the pseudo-random number generator used by rand()
. So when you call srand(i)
, it will initialise rand()
to a fixed sequence which depends on i
. So when you re-seed with the same seed, you start getting the same sequence.
The most common use case is to seed the generator just once, and with a suitable "random" value (such as the idiomatic time(NULL)
). This guarantees makes it likely that you'll get different sequences of pseudo-random numbers in different program executions.
However, occasionally you might want to make the pseudo-random sequence "replayable." Imagine you're testing several sorting algorithms on random data. To get fair comparisons, you should test each algorithm on the exact same data - so you'll re-seed the generator with the same seed before each run.
In other words: if you want the numbers simply pseudo-random, seed once, and with a value as random as possible. If you want some control & replayability, seed as necessary.