Форум: "Основная";
Текущий архив: 2003.05.26;
Скачать: [xml.tar.bz2];
ВнизRandom... Найти похожие ветки
← →
Valentino (2003-05-13 11:16) [0]Допустим у меня есть диапазон в N чисел. Надо каждый раз случайно вибирать по одно из них.
Как сделать так, чтобы исключить возможность повторного выбора.
Random"om не получается. Пробовал randomize по-разному: один раз и каждый раз - не помогает.
Помогите, кто знает как сделать?
← →
Dms (2003-05-13 11:24) [1]тебе нужна случайная последовательность длиной N из множества [1..N] без возвращений ?
randomize тут не поможет
a[1..N] - массив
for i:=1 to N do a[i]:=i;
for i:=1 to N do begin
j:=Random(N)+1;
tmpI:=a[i];
a[i]:=a[j];
a[j]:=tmpI;
end;
теперь массив a[1..N] - составлен из чисел 1..N случайно переставленных. Выбирай по порядку - повторений не будет
← →
dtrn (2003-05-13 11:49) [2]type
Arr1 = Record
Arr : array[0..100] of integer;
Mask: array[0..100] of boolean;
end;
type
TForm1 = class(TForm)
Button1: TButton;
SpinEdit1: TSpinEdit;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
Arr2:Arr1;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
I:integer;
begin
Randomize;
I:=Random(High(Arr2.Arr));
if not Arr2.Mask[I] then
begin
Arr2.Mask[I]:=TRUE;
SpinEdit1.Value:=Arr2.Arr[I];
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
I:integer;
begin
for I:=Low(Arr2.Arr) to High(Arr2.Arr) do
begin
Arr2.Arr[I]:=I+1;
Arr2.Mask[I]:=FALSE;
end;
end;
end.
← →
Digitman (2003-05-13 14:23) [3]procedure InitList(List: TList; LowRange, HighRange: Word);
begin
with List do
begin
Clear;
if LowRange <= HighRange then
Add(Pointer((HighRange shl 16) or LowRange))
else
Add(Pointer((LowRange shl 16) or HighRange));
end;
end;
function GetNextUniqueNumber(List: TList; out Value: Word): Boolean;
var
LowRange, HighRange: Word;
Range: DWord;
i: Integer;
begin
with List do
begin
Result := Count > 0;
if Result then
begin
i:= Random(Count);
Range := DWord(Items[i]);
LowRange := LoWord(Range);
HighRange := HiWord(Range);
Value := LowRange + Random(Succ(HighRange - LowRange));
if LowRange < Value then
Items[i] := Pointer(((Pred(Value) shl 16) or LowRange));
if Value < HighRange then
if LowRange < Value then
Insert(Succ(i), Pointer(((HighRange shl 16) or Succ(Value))))
else
Items[i] := Pointer(((HighRange shl 16) or Succ(Value)));
if LowRange = HighRange then
Delete(i);
end;
end;
end;
procedure TForm1.Button4Click(Sender: TObject);
var
List: TList;
s: string;
NextValue: Word;
begin
Randomize;
List := TList.Create;
try
InitList(List, 1, 20);
while GetNextUniqueNumber(List, NextValue) do
s := s + IntToStr(NextValue) + " ";
ShowMessage(s);
s := "";
InitList(List, 21, 40);
while GetNextUniqueNumber(List, NextValue) do
s := s + IntToStr(NextValue) + " ";
ShowMessage(s);
finally
List.Free;
end;
end;
← →
Sandman25 (2003-05-13 18:20) [4]for i := 1 to N do A[i] := i;
for j := N downto 1 do
begin
RandomIndex := random(j)+1;
RandomValue := A[RandomIndex];{ Или RandomArr[j] := A[RandomIndex], если нужно сохранить}
A[RandomIndex] := A[j];
end;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.05.26;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.007 c