Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.26;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.019 c
4-83801
bobo
2003-03-25 19:06
2003.05.26
Как сделать ПЛАВНУЮ прокрутку в Rich Edit control ?


3-83334
igor
2003-05-05 13:32
2003.05.26
Глюки ADO


1-83602
Imshanya
2003-05-14 13:25
2003.05.26
Хочу добавить форме published property


4-83788
Saska
2003-03-24 13:09
2003.05.26
GetSystemTime


14-83697
Hooch
2003-05-06 11:47
2003.05.26
Оракл