Показать сообщение отдельно
  #2  
Старый 06.03.2009, 20:35
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,090
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Я правильно понимаю, что тебе надо заполнить 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(), возвращающими нижнюю и верхнюю границы массива.
Ответить с цитированием