Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения
KANSoftWare

Заполнения массива случаными неповторяющимися значениями

Delphi , Синтаксис , Массивы

Заполнения массива случаными неповторяющимися значениями

Автор: Дедок Василий

Огромное Вам спасибо за сбор и систематизацию советов по Delphi. Предлагаю Вам интересное решение заполнения массива случаными неповторяющимися значениями. Думаю этот алгоритм небесполезен.


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;

Here's the translation of the text into Russian:

Это умелый способ заполнить массив случайными, не повторяющимися значениями. Вот разбивка кода:

Декларация типа

type
  arr = array[1..255] of integer;

Объявляет одномерный массив arr с 255 элементами каждого из типов integer.

Процедура FillArray Принимает два параметра: A, массив целых чисел, который нужно заполнить, и n, количество случайных значений для генерации.

procedure FillArray(var A: arr; n: integer);

Декларация переменных

var
  i: integer;
  s: string;
  q: byte;
begin

Объявляет три переменные:

  • i - целочисленная переменная, используемая как счетчик цикла.
  • s - строковая переменная, используемая для хранения случайных значений.
  • q - байтовая переменная, используемая для хранения случайного индекса.

Инициализация и основной логик Процедура выполняет два основных задачи: 1. Случайное значение: вызывает randomize для посева генератора случайных чисел. 2. Генерация случайных значений: циклится n раз, чтобы генерировать случайные значения. * Для каждой итерации: 1. Генерирует случайный индекс q между 1 и текущим счетчиком цикла i. 2. Добавляет символ (ASCII-код i) в позиции q в строке s.

Заполнение массива Процедура затем циклится снова, чтобы заполнить массив случайными значениями:

  • Для каждой итерации:
  • Присваивает ASCII-код соответствующего символа в s элементу в индексе i в массиве A.

Вот альтернативное решение с более эффективным подходом:

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

type
  arr = array[1..255] of integer;
procedure FillArray(var A: arr; n: integer);
var
  i: integer;
  s: TBooleanSet;
begin
  randomize;
  s := {};
  for i := 1 to n do
  begin
    while true do
    begin
      A[i] := Random(256);
      if not s.Contains(A[i]) then
        Exit;
    end;
  end;
end;

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

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

В статье предложено оригинальное решение для заполнения массива случайными неповторяющимися значениями в языке Delphi, использующее функцию Random и строковый метод Insert для генерации уникальных символов.


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


:: 2009-02-18 20:12:13 :: re:Заполнения массива случаными неповторяющимися значениями

пользователь: maximus825.

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


:: 2010-07-05 19:28:47 :: re:Заполнения массива случаными неповторяющимися значениями

пользователь: Антон.

Пример хороший. Но есть один минус - в конце массива всегда 1. Я исправил так:

procedure FillArray(var A: arr;n: integer);
var
i: integer;
s: string;
q: byte;
r: integer;
begin
randomize;
s := '';
for i := 1 to n do
begin
q := random(i);
insert(chr(i), s, q);
end;
r:=random(n-1)+1;
s[length(s)]:=s[r];
s[r]:=chr(1);
for i := 1 to n do
begin
A[i] := ord(s[i]);
end;
end;


Ваше мнение или вопрос к статье в виде простого текста (Tag <a href=... Disabled). Все комментарии модерируются, модератор оставляет за собой право удалить непонравившейся ему комментарий.

заголовок

e-mail

Ваше имя

Сообщение

Введите код




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



:: Главная :: Массивы ::


реклама



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

Время компиляции файла: 2024-05-19 17:53:24
2024-05-19 19:57:40/0.0070230960845947/2