Принцип большинства алгоритмов получения случайных чисел - новое псевдослучайное значение получается на основе предыдущего значения.
Например, самое простенькое для С:
unsigned long rtrand( void ) {
rtseed = rtseed * 0x41C64E6D + 0x3039; // получить новое значение случайное
return (rtseed>>16)&0x7FFF; // обрезать его до нужной величины.
}
И, если программа будет начинаться с одним и тем же начальным значением, то вся цепочка повторится. Сколько угодно раз. Попробуйте посмотреть значения, создаваемые рандомом без этой функции.
Первый запуск программы: 1 9 8 5 7 3 2 9 4 8 (написал наугад)
Второй запуск программы: 1 9 8 5 7 3 2 9 4 8
Третий запуск программы: 1 9 8 5 7 3 2 9 4 8
...
А функция Randomize в качестве начального значения берёт какое-то число, которое всегда разное. Например, время в миллисекундах. Как бы не запускали программу, время уже не повторится.
И все цепочки станут другими.
Первый запуск программы: 3 9 1 7 4 9 2 3 8 2 (написал наугад)
Второй запуск программы: 1 5 6 3 3 4 6 7 2 9
Третий запуск программы: 3 4 8 2 5 1 6 8 3 1
...
Вряд ли вы встретите повторение цепочки при последовательном запросе чисел =) Цепочки там ужасть какие длинные)
Не думайте, что ограничивая выходной диапазон, вы заставите его повторяться - ограничение идёт на выходе алгоритма (обычно как остаток от деления return (minval + rtseed mod (maxval - minval)), внутри используются очень большие числа.
И да, не путайте повторение числа - а они будут повторяться, если их немного, - от повторения последовательности псевдослучайных чисел. Самое главное, чтобы эти числа укладывались в заданное случайное распределение =) Что, в принципе, задано алгоритмически и будет выполняться всегда.