Если тебя волнует промежуток на котором будут эти числа, то смело суммируй.
Пример:
цикл
sum = рандом()
н_i += sum
конец цикла
Ну а рандом от 0 до 1, поэтому все чиcла разные будут.
Можно с затратами памяти:
Строишь массив 1,2,3 ... RND_MAX. Перемешиваешь его
за RND_MAX шагов по следующему алгоритму: на i-ом шаге цикла от 1 до RND_MAX выбираешь случайный элемент между i-ым и последним массива и меняешь его значения (swap) с i-ым.
Если N < RND_MAX, то перемешать можно только первые N элементов.
Пример
1 2 3 4 5 6 7 8 9
3 2 1 4 5 6 7 8 9
3 7 1 4 5 6 2 8 9
3 7 6 4 5 1 2 8 9
.....
Создаёшь массив, выбираешь несколько случайных чисел и пропускаешь через функцию, которая будет на основе них делать уникальные числа. Ещё лучше на основе одного числа, чтобы гарантировать неповторимость.
Кстати функцию можно сделать так, чтобы следующее число генерировалось на основе предыдущего, либо чтобы функция выдавала заданное количество таких уникальных чисел. Причём дважды случайность можно использовать:
1. Генерация базового числе
2. Генерация случайного числа, на основе которого будет делаться преобразование + перебор цикла для получения уникальности, скажем для уникального множителя или другого параметра.
Можно решить за o(N). Если взять правильный генератор ПСЧ с длиной последовательности на много порядков превышающей размерность массива. Про генераторы ПСЧ читать у Кнута.