Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

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

Delphi , Синтаксис , Математика



Автор: http://www.swissdelphicenter.ch

procedure Shuffle(var aArray; aItemCount: Integer; aItemSize: Integer);
{ after Julian M Bucknall }
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;

Переведенный текст:

Код - это программный проект на языке Delphi, который реализует алгоритм Fisher-Yates shuffle, широко используемый для генерации случайной перестановки конечного последовательности. Процедура Shuffle принимает в качестве параметров массив aArray, количество элементов aItemCount и размер элемента aItemSize.

Рассмотрим, как работает код:

  1. Процедура Shuffle сначала проверяет, является ли количество элементов больше 1. Если это так, она инициализирует временный буфер обмена SwapItem с тем же размером, что и каждый элемент массива.
  2. Затем она проходит по массиву от второго элемента до последнего (поскольку мы не интересуемся перестановкой первого элемента).
  3. В каждой итерации она генерирует случайный индекс RandInx в оставшейся непереставленной части массива (от текущего индекса до конца). Это делается с помощью функции Random.
  4. Затем она обменивает элементы по индексам Inx и RandInx. Это делается, перемещая данные из одного элемента в временный буфер, а затем - обратно в другой элемент.
  5. Наконец, после того как все элементы будут переставлены, она освобождает память, выделенную для буфера обмена.

Процедура Button1Click демонстрирует, как использовать этот алгоритм:

  1. Она инициализирует массив a целых чисел с значениями от 1 до 10.
  2. Она случайно инициализирует функцию Random с помощью Randomize.
  3. Она заполняет массив последовательными целыми числами (т.е., она инициализирует массив).
  4. Она вызывает процедуру Shuffle, чтобы переставить массив.
  5. Наконец, она добавляет каждый элемент переставленного массива в виде строки в список.

Чтобы получить не повторяющиеся случайные числа, можно использовать этот алгоритм в сочетании с хранением генерируемых случайных чисел в множестве или коллекции, которая отслеживает уникальные элементы. Вот пример:

procedure TForm1.Button2Click(Sender: TObject);
var
  a: TCollection;
  i: Integer;
begin
  Randomize;
  a := TCollection.Create;
  for i := 1 to 10 do
    if not a.Contains(i) then
      a.Add(i);
  Shuffle(a, a.Count, SizeOf(Integer));
  for i := 0 to High(a) do
    ListBox1.Items.Add(IntToStr(a[i]));
end;

В этом примере мы создаем пустую коллекцию a и заполняем ее уникальными целыми числами от 1 до 10. Затем мы переставляем коллекцию с помощью того же алгоритма, что и раньше. Наконец, мы добавляем каждый элемент переставленной коллекции в виде строки в список.

Обратите внимание, что это реализация имеет ограничения при генерации случайных чисел для большого диапазона или для маленького диапазона с высокой точностью. В таких случаях может потребоваться использование болееadvanced алгоритмов или библиотек.

В статье описывается алгоритм получения неповторяющихся случайных чисел в программировании на языке Delphi, реализуемый с помощью процедуры Shuffle, которая использует алгоритм Фишера-Йатса.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Математика ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-04-26 16:48:58/0.0034220218658447/0