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

Материал из 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