Я правильно понимаю, что тебе надо заполнить N числами ПОДРЯД, но в СЛУЧАЙНОМ ПОРЯДКЕ?
Тут такая фигня, что обычный метод генерации случайных чисел тут плохой помошник. Он может работать неопределенно долгое время, особенно при генерации последних чисел. Я бы предложил немного другой алгоритм.
Есть массив 1..N, который надо заполнить числами 1..N в случайном порядке. в цикле от 1 до N мы генерим не сами числа, а их индексы в массиве. При этом, если ячейка уже занята, то не перегенерируем индекс, а сдвигаем его веред до первой свбодной ячейки с циклическим сдвигом (т.е. если после сгенерированного индекса нет ни одной свободной ячейки, то дальше начинаем искать место с начала массива).
Итак:
Код:
procedure GenerateList(N : Integer);
var
I, Idx : Integer;
AList : Array Of Integer;
begin
// Сначала делаем массив и инициализируем его нулями
SetLength(AList,N);
For I := Low(AList) To High(AList) Do
AList[i] := 0;
// Теперь начинаем заполнять массив
For I := 1 To N Do
Begin
Idx := Random(N);
If AList[Idx] = 0
Then AList[Idx] := I // ячейка и так пустая
Else // ячейка занята. ищем другое место
Begin
While AList[Idx] <> 0 Do
Begin
Inc(Idx);
If Idx > High(AList) Then Idx := Low(AList);
End;
AList[Idx] := I;
End;
End;
// Теперь выводим результат в мемо.
Memo1.Lines.Clear;
For I := Low(AList) To High(AList) Do
Memo1.Lines.Add(IntToStr(AList[i]);
end;
На самом деле проверка на пустую ячейку не нужна, она добавлена для понятности алгоритма.
Еще несколько замечаний:
1. Динамический массив всегда начинается с 0.
2. Random(N) возвращает случайное число от 0 до N-1.
3. При работе с массивами всегда лучше пользоваться функциями Low() и High(), возвращающими нижнюю и верхнюю границы массива.