Как получить неповторяющиеся случайные числа?
Материал из DRKB
Перемешивание элементов массива случайным образом[править | править код]
{ after Julian M Bucknall }
procedure Shuffle(var AArray; AItemCount: Integer; AItemSize: Integer);
var
Inx: Integer;
RandInx: Integer;
SwapItem: PByteArray;
A: TByteArray absolute AArray;
begin
if (AItemCount > 1) then
begin
GetMem(SwapItem, AItemSize);
try
for Inx := 0 to (AItemCount - 2) do
begin
RandInx := Random(AItemCount - Inx);
Move(A[Inx * AItemSize], SwapItem^, AItemSize);
Move(A[RandInx * AItemSize], A[Inx * AItemSize], AItemSize);
Move(SwapItem^, A[RandInx * AItemSize], AItemSize);
end;
finally
FreeMem(SwapItem, AItemSize);
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
a: array[1..10] of Integer;
i: Shortint;
begin
Randomize;
for i := Low(a) to High(a) do a[i] := i;
Shuffle(a, High(a), SizeOf(Integer));
for i := 1 to High(a) - 1 do
ListBox1.Items.Add(IntToStr(a[i]));
end;
Source: http://www.swissdelphicenter.ch/en/tipsindex.php
ID: 04130
ID: 04134
256 разных чисел в случайном порядке[править | править код]
type
arr = array[1..255] of Integer;
procedure FillArray(var A: arr; n: Integer);
var
i: Integer;
s: string;
q: Byte;
begin
Randomize;
s := '';
for i := 1 to n do
begin
q := Random(i);
Insert(Chr(i), s, q);
end;
for i := 1 to n do
begin
A[i] := Ord(s[i]);
end;
end;
Author: Дедок Василий
ID: 04131
Заполняет динамический массив чисел разными числами в случайном порядке[править | править код]
procedure FillArray(var A: array of Integer);
var
i, S, R: Integer;
begin
for i := 0 to High(A) do
A[i] := i;
for i := High(A) downto 0 do
begin
R := Random(i);
S := A[R];
A[R] := A[i];
A[i] := S;
end;
end;
Author: Иваненко Фёдор Григорьевич
Source: http://delphiworld.narod.ru
ID: 04132
Заполнение массива неповторяющимися случайными целыми числами[править | править код]
{ **** UBPFD *********** by delphibase.endimus.com ****
>> Заполнение массива неповторяющимися случайными целыми числами
Данная процедура заполняет заданный массив случайными неповторяющимися целыми числами.
Заполнения идет числами начиная с 1, если вам необходимо заполнить массив числами с 0,
то измените строку:
inputMass[i] := Unic(bm, range)+1;
на
inputMass[i] := Unic(bm, range);
Зависимости: стандартные модули
Автор: Ru, DiVo_Ru@rambler.ru, Одесса (Украина)
Copyright: DiVo 2003 creator Ru
Дата: 22 октября 2003 г.
***************************************************** }
procedure MassRand(range: Integer; var InputMass: array of Integer);
var
i: Integer;
bm: array of Boolean; // массив флагов для отслеживания было уже число или нет
begin
SetLength(bm, Length(InputMass));
for i := 0 to Length(InputMass) - 1 do
begin
InputMass[i] := Unic(bm, range) + 1; // для последовательности 1,2, ... , N
//InputMass[i] := Unic(bm, range); // для последовательности 0,1, ... , N
end;
end;
function Unic(var flag: array of Boolean; range: Integer): Integer;
begin
{ данная функция возвращает одно случайное число }
Result := Random(range);
while flag[Result] do
Result := Random(range); // ищем какого числа еще нет
flag[Result] := True; // это чтобы не было повторений
end;
// Использовать можно по разному, например:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
i: Integer;
mass: array of Integer; // массив над которым будем извращаться
begin
Memo1.Lines.Clear; // сюда выведем результат
SetLength(mass, StrToInt(Edit1.Text)); // тут получим размерность массива
MassRand(StrToInt(Edit1.Text), mass); // соответственно поимели процедуру
for i := 0 to Length(mass) - 1 do
begin
Memo1.Lines.Add(IntToStr(mass[i])); // отобразили пользователю результат
end;
end;
Author: Ru
Source: http://delphibase.endimus.com
ID: 04133