1) Создать список размером N, в котором все элементы - false, пусть будет arr
2) Генерировать число, пусть - value
3) Если arr[value] == false - то заносим число в итоговый список и arr[value] = true. Если arr[value] == true - переходим к пункту 2.
Сложность тем выше, чем ближе m к n.
Можно попробовать генерировать блоками. Например, если n == 100, и от 0 до 10 уже сгенероно >50% чисел - то в этом диапазоне не генерим вообще. Но сходу не могу сообразить словесный алгоритм.