Цитата:
Сообщение от 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