Как получить неповторяющиеся случайные числа?

== Перемешивание элементов массива случайным образом ==
{ 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
Category:Алгоритмы
Category:Математика