Любезный
30-09-2012, 16:20
Приветствую уважаемых коллег. Хочу обсудить с вами такой вопрос. В один из своих проектов я недавно добавил такой код:
const SettingCount = 15;
var SortedSettingNumbers: array [0..SettingCount-1] of smallint;
i, j, r: smallint;
label lab1;
...
for I:=0 to SettingCount-1 do SortedSettingNumbers [i]:=-1;
Randomize;
for I:=0 to SettingCount-1
do if SortedSettingNumbers [i]=-1
then begin
lab1: r:=Random (SettingCount);
// проверить сгенерированное число на повтор
b:=false;
for j:=0 to SettingCount-1
do if SortedSettingNumbers [j]=r
then begin
b:=true;
break;
end;
// если повторяется - сгенерить другое
if b then goto lab1;
SortedSettingNumbers [i]:=r
end;
Задача этого кода - заполнить массив SortedSettingNumbers случайными числами в диапазоне от 0 до SettingCount-1 таким образом, чтобы числа не повторялись, т.е. по сути дела получить в массиве перемешанную последовательность чисел.
Есть два вопроса:
а) Как лучше переписать такой код, чтобы убрать goto, которое многие программисты не любят? Мне в голову это никак не придёт.
б) Хотелось бы также услышать предложения по ускорению этого кода, так как в будущем, возможно, придётся сильно увеличить константу SettingCount.
const SettingCount = 15;
var SortedSettingNumbers: array [0..SettingCount-1] of smallint;
i, j, r: smallint;
label lab1;
...
for I:=0 to SettingCount-1 do SortedSettingNumbers [i]:=-1;
Randomize;
for I:=0 to SettingCount-1
do if SortedSettingNumbers [i]=-1
then begin
lab1: r:=Random (SettingCount);
// проверить сгенерированное число на повтор
b:=false;
for j:=0 to SettingCount-1
do if SortedSettingNumbers [j]=r
then begin
b:=true;
break;
end;
// если повторяется - сгенерить другое
if b then goto lab1;
SortedSettingNumbers [i]:=r
end;
Задача этого кода - заполнить массив SortedSettingNumbers случайными числами в диапазоне от 0 до SettingCount-1 таким образом, чтобы числа не повторялись, т.е. по сути дела получить в массиве перемешанную последовательность чисел.
Есть два вопроса:
а) Как лучше переписать такой код, чтобы убрать goto, которое многие программисты не любят? Мне в голову это никак не придёт.
б) Хотелось бы также услышать предложения по ускорению этого кода, так как в будущем, возможно, придётся сильно увеличить константу SettingCount.