Because You need to write code to generates the random numbers and Code is NOT random. (It's deterministic)
So you wind up starting with a "Seed value(s)" that is picked at "Random" (usually the current time stamp) then use it in an algorithm to start generating numbers. But the entire set of is based off the original Seed value!
So if you run your code again with the exact same Seed value(s), you will get the EXACT same SET of numbers! How can any reasonably person call that random? But it sure does LOOK random.
Regarding making them unique, After generating a number simply check if you already have that number, if you do, throw it away and generate a new one.