Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-83654
jazi
2003-05-07 08:45
2003.05.26
Самые дешевые цены по Москве!!!


3-83349
StillBird
2003-05-05 18:05
2003.05.26
Как передать имя базы данных как параметр процедуры ?


4-83795
Num Lock
2003-03-26 15:21
2003.05.26
Как без окна обработать сообщения от всплывающего меню?


1-83491
AstraS
2003-05-15 17:08
2003.05.26
QReport


6-83638
Danger
2003-03-29 17:11
2003.05.26
TWebBrowser





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский