Lazarus: Генерация случайной строки из определенного алфавита (паттерна) символов.
На самом деле, оказалось довольно простой задачей.
var P1,P2,P3,P4:String; I:Integer;
begin
P1:='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
P2:='ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
P3:='abcdefghijklmnopqrstuvwxyz0123456789';
P4:='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
for I:=1 to 23 do
begin
WriteLn(GenerateString(75,P1));
end;
WriteLn('Press ENTER');
ReadLn();
end.Пока все совсем просто, создаем 4 паттерна (алфавита) для теста, заполняем паттерны, создаем счетчик для цикла, а в цикле вызываем функцию
GenerateString, таким образом генерируем 23 строки.1. Функция
GenerateString принимает 2 параметра - длина генерируемой строки и паттерн/алфавит, возвращает строку:function GenerateString (len:Integer; Pattern:String): String;2. Заводим две внутренних переменных, счетчик для текущей позиции символа в генерируемой строке, и переменную для хранения случайного символа, который получим из строки
Pattern:var I:Integer; C:Char;3. Инициализируем значение переменной
Result, которую функция автоматически возвратит в качестве результата функции:Result:='';Если этого не сделать, то при попытке заранее выделить память под переменную, компилятор выдаст предупреждение:
Hint: Function result variable of a managed type does not seem to be initialized (Подсказка: Переменная результата функции управляемого типа, похоже, не инициализирована).4. И счетчик для текущего символа:
I:=0;5. Выделяем память под будущую строку, если этого не сделать, память будет выделяться динамически, что будет тормозить процесс:
SetLength(Result,len);6. Запускаем цикл:
while I < len do
begin
//...
end;
В цикле:
1. Получаем случайный символ.
2. Записываем полученный символ в нужное место результирующей строки.
3. Увеличиваем счетчик цикла.
В Pascal это очень просто, строка рассматривается как массив, а символы - элементы массива. Нумерация символов в строке начинается с единицы, т.е. если мы хотим в переменную
C (типа char) записать третий символ из строки Pattern, то это делается так:C:=Pattern[3];Для этого применяется функция
RandomRange из модуля Math со следующим синтаксисом:RandomRange(начальное_значение, конечное_значение);т.е. если вызвать функцию таким образом:
I:= RandomRange(1,10);то в переменной
I (целого типа) окажется случайное значение от 1 до 10.Внимание! Не забудьте в начале программы подключить модуль
Math!Uses Math;Ну а длина строки, это совсем просто:
Length(Pattern).Итого:
1. Получение случайного символа:
C:=Pattern[RandomRange(1, Length(Pattern))];2. Запись символа в результирующую строку:
Result[I+1]:=C;3. Увеличение счетчика:
inc(I);function GenerateString (len:Integer; Pattern:String): String;
var I:Integer; C:Char;
begin
Result:='';
I:=0;
SetLength(Result,len);
while I < len do
begin
C:=Pattern[RandomRange(1, Length(Pattern))];
Result[I+1]:=C;
inc(I);
end;
end;
На GitHub
Это репост с сайта http://tolik-punkoff.com
Оригинал: https://tolik-punkoff.com/2023/05/24/laz