Показать сообщение отдельно
  #8  
Старый 08.03.2009, 14:46
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Цитата:
Сообщение от lmikle
Врете вы все. Только что проверил свой код. Там не хватает одной скобки и ссылки при адресации мемо на форму, а в остальном все работает как часы. Дает список из N чисел в произвольном порядке.
lmikle не кипятись - работает твой код. Только он расставляет числа [1..N] в случайном порядке, а у меня заполняет K строк числами [1..N] в случайном порядке.
(немного переделал твою и свою):
Код:
// расстановка N чисел случайным порядком
procedure GenerateList(N : Integer; St: TStrings);
var
  I, Idx, HIdx : Integer;
  AList : Array Of Integer;
begin
  St.Clear;
  if N <= 0 then
    Exit;
  // Сначала делаем массив и инициализируем его нулями
  SetLength(AList,N);
  try
    HIdx := N - 1;
    For I := 0 To HIdx Do
      AList[i] := 0;

    // Теперь начинаем заполнять массив
    For I := 1 To N Do
    Begin
      Idx := Random(N);
      While AList[Idx] <> 0 Do
      Begin
       Inc(Idx);
       If Idx > HIdx Then Idx := 0;
      End;
      AList[Idx] := I;
    End;

    // Теперь выводим результат.
    For I := 0 To HIdx Do
      St.Add(IntToStr(AList[i]));
  finally
    SetLength(AList, 0);
  end;
end;

// заполнение K строк числами 1..N в случайном порядке
procedure FillList(K, N : Integer; St: TStrings);
var
  mass:Array Of Integer;
  i, j, HIdx:integer;
  chek: Boolean;
  a:integer;
begin
  St.Clear;
  if K <= 0 then
    Exit;
  if N < K then
    raise Exception.Create('Диапазон [1..'+ IntToStr(N)+'] меньше количества строк ['+ IntToStr(K)+']');

  SetLength(mass,K);
  try
    HIdx := K - 1;

    for i := 0 to HIdx do
    begin
      repeat
        chek := true;
        a:=random(N) + 1;
        for j := 0 to i - 1 do
        begin
          chek := not (a = mass[j]);
          if not chek then
            break;
        end;
      until chek;
      mass[i] := a;
      St.Add(inttostr(a));
    end;
  finally
    SetLength(mass, 0);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  FillList(5,30,Memo1.Lines);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  GenerateList(5,Memo1.Lines);
end;
Убрал Low(AList) - здесь всегда = 0
и High(AList) = N - 1

Ответить с цитированием