Главная страница
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.016 c
11-83433
Kirill
2002-08-20 22:14
2003.05.26
About Form


1-83459
BLAST
2003-05-15 02:36
2003.05.26
Нужна помощь с TRichEdit по поиску ничего не нашел :-((


14-83729
Дмитрий К.К.
2003-05-07 06:23
2003.05.26
Именинники 7 мая


1-83527
$HiC0
2003-05-13 15:15
2003.05.26
Рисование прямо на Bitmapе


4-83818
bobo
2003-03-25 11:11
2003.05.26
В Rich edit вращением колесика мыши при нажатой левой кнопке можн