Как сделать рандом в паскале

Как сделать рандом в паскале

Как сделать рандом в паскале. Смотреть фото Как сделать рандом в паскале. Смотреть картинку Как сделать рандом в паскале. Картинка про Как сделать рандом в паскале. Фото Как сделать рандом в паскале

Оператор random — генератор случайных чисел

Часто в задачах требуется выполнить различные действия с большим количеством чисел. В таких случаях вводить все числа становится просто неудобно и долго. Для этого в Паскале придуман генератор случайных чисел — оператор random.

От программиста лишь требуется задать числовые промежутки ( например от 2 до 50 ), все остальное программа выполнит сама. Итак как добавить к коду программы оператор random.

Для начала необходимо предварительно описать оператор (то есть фактически мы сообщаем программе, что будет использован генератор случайных чисел). Для этого необходимо ввести оператор randomize в промежутке после begin и до random (обычно оператор randomize ставят сразу после begin, так как это упрощает чтение кода). Затем идет присвоение оператора random к выбранной переменной. Делается это так:
Для Turbo Pascal

Здесь 4 — это результат выражения 5-2+1.

Для Pascal ABC

Здесь можно применять оператор random так же как и для Turbo Pascal, однако есть еще один вариант, более простой в использовании.

Чтобы разница лучше просматривалась решим тот же пример генератора случайных чисел от 2 до 5 этим способом.

Как уже стало заметно второй способ гораздо проще, однако его можно использовать только в Pascal ABC. А для тех, кого интересует код программы, где используется рандом без повтора генерируемых чисел я написал этот пост. В нем при генерации каждого числа происходит сравнение с предыдущем числом.

Источник

Pascal: Занятие № 5. Одномерные массивы в Паскале

Одномерные массивы в Паскале

Объявление массива

Массивы в Паскале используются двух типов: одномерные и двумерные.
Определение одномерного массива в Паскале звучит так: одномерный массив — это определенное количество элементов, относящихся к одному и тому же типу данных, которые имеют одно имя, и каждый элемент имеет свой индекс — порядковый номер.
Описание массива в Паскале (объявление) и обращение к его элементам происходит следующим образом:

Как сделать рандом в паскале. Смотреть фото Как сделать рандом в паскале. Смотреть картинку Как сделать рандом в паскале. Картинка про Как сделать рандом в паскале. Фото Как сделать рандом в паскале

Объявить размер можно через константу:

Как сделать рандом в паскале. Смотреть фото Как сделать рандом в паскале. Смотреть картинку Как сделать рандом в паскале. Картинка про Как сделать рандом в паскале. Фото Как сделать рандом в паскале

Инициализация массива

Кроме того, массив может быть сам константным, т.е. все его элементы в программе заранее определены. Описание такого массива выглядит следующим образом:

const a:array[1..4] of integer = (1, 3, 2, 5);

Заполнение последовательными числами:
Как сделать рандом в паскале. Смотреть фото Как сделать рандом в паскале. Смотреть картинку Как сделать рандом в паскале. Картинка про Как сделать рандом в паскале. Фото Как сделать рандом в паскале

var a: array of integer; var n:=readInteger; a:=new integer[n];

var a: array of integer; var n:=readInteger; SetLength(a,n); // устанавливаем размер

begin var a: array of integer; a := new integer[3]; a[0] := 5; a[1] := 2; a[2] := 3; end.

begin var a: array of integer; a := new integer[3](5,2,3); print(a) end.

Ввод с клавиатуры:

var a:=ReadArrInteger(5); // целые var a:=ReadArrReal(5); // вещественные

Вывод элементов массива

var a: array[1..5] of integer; <массив из пяти элементов>i: integer; begin a[1]:=2; a[2]:=4; a[3]:=8; a[4]:=6; a[5]:=3; writeln(‘Массив A:’); for i := 1 to 5 do write(a[i]:2); <вывод элементов массива>end.

Для работы с массивами чаще всего используется в Паскале цикл for с параметром, так как обычно известно, сколько элементов в массиве, и можно использовать счетчик цикла в качестве индексов элементов.

[Название файла: taskArray0.pas ]

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

for var i:=0 to a.Length-1 do a[i] += 1;

Проход по элементам (только для чтения):
Пример:

foreach var x in a do Print(x)

Функция Random в Pascal

Диапазон в Паскале тех самых случайных чисел от a до b задается формулой:

var f: array[1..10] of integer; i:integer; begin randomize; for i:=1 to 10 do begin f[i]:=random(10); < интервал [0,9] >write(f[i],’ ‘); end; end.

Для вещественных чисел в интервале [0,1]:

или с дополнительными параметрами (диапазон [5;15]):

[Название файла: taskArray1.pas ]

Числа Фибоначчи в Паскале

Наиболее распространенным примером работы с массивом является вывод ряда чисел Фибоначчи в Паскаль. Рассмотрим его.

Получили формулу элементов ряда.

var i:integer; f:array[0..19]of integer; begin f[0]:=1; f[1]:=1; for i:=2 to 19 do begin f[i]:=f[i-1]+f[i-2]; writeln(f[i]) end; end.

[Название файла: taskArray2.pas ]

Максимальный (минимальный) элемент массива

Поиск максимального элемента по его индексу:
Как сделать рандом в паскале. Смотреть фото Как сделать рандом в паскале. Смотреть картинку Как сделать рандом в паскале. Картинка про Как сделать рандом в паскале. Фото Как сделать рандом в паскале

// … var (min, minind) := (a[0], 0); for var i:=1 to a.Length-1 do if a[i]

[Название файла: taskArray_min.pas ]

[Название файла: taskArray4.pas ]

[Название файла: taskArray5.pas ]

[Название файла: taskArray6.pas ]

Пример:

[Название файла: taskArray7.pas ]

Поиск в массиве

Рассмотрим сложный пример работы с одномерными массивами:

Для решения поставленной задачи понадобится оператор break — выход из цикла.
Решение Вариант 1. Цикл for:

var f: array[1..10] of integer; flag:boolean; i,c:integer; begin randomize; for i:=1 to 10 do begin f[i]:=random(10); write(f[i],’ ‘); end; flag:=false; writeln(‘введите образец’); readln(c); for i:=1 to 10 do if f[i]=c then begin writeln(‘найден’); flag:=true; break; end; if flag=false then writeln(‘не найден’); end.

begin var a := new integer[10]; a := arrRandomInteger(5,0,5); //[1,3,5,4,5] print(a.IndexOf(3)) // 1 end.

или метод a.Contains(x) наравне с x in a :

begin var a := new integer[10]; a := arrRandomInteger(5,0,5); //[1,3,5,4,5] print(a.Contains(3)); // True print(3 in a)// True end.

Рассмотрим эффективное решение:

Алгоритм:

решение на Паскале Вариант 2. Цикл While:

Как сделать рандом в паскале. Смотреть фото Как сделать рандом в паскале. Смотреть картинку Как сделать рандом в паскале. Картинка про Как сделать рандом в паскале. Фото Как сделать рандом в паскале

Поиск элемента в массиве

Предлагаем посмотреть подробный видео разбор поиска элемента в массиве (эффективный алгоритм):

Пример:

[Название файла: taskArray8.pas ]

Циклический сдвиг

Решение:

Программа:
Как сделать рандом в паскале. Смотреть фото Как сделать рандом в паскале. Смотреть картинку Как сделать рандом в паскале. Картинка про Как сделать рандом в паскале. Фото Как сделать рандом в паскале

// … var v := a[0]; for var i:=0 to a.Length-2 do a[i] := a[i+1]; a[a.Length-1] := v;

// … var v := a[a.Length-1]; for var i:=a.Length-1 downto 1 do a[i] := a[i-1]; a[0] := v;

[Название файла: taskArray9.pas ]

Перестановка элементов в массиве

Рассмотрим, как происходит перестановка или реверс массива.

Решение:

Псевдокод:
Как сделать рандом в паскале. Смотреть фото Как сделать рандом в паскале. Смотреть картинку Как сделать рандом в паскале. Картинка про Как сделать рандом в паскале. Фото Как сделать рандом в паскале

Программа:
Как сделать рандом в паскале. Смотреть фото Как сделать рандом в паскале. Смотреть картинку Как сделать рандом в паскале. Картинка про Как сделать рандом в паскале. Фото Как сделать рандом в паскале

Решение 2 (стандартная процедура Reverse() ):

begin var a:=new integer[10]; a:=arrRandomInteger(10); print(a);// [41,81,84,63,12,26,88,25,36,72] Reverse(a); print(a) //[72,36,25,88,26,12,63,84,81,41] end.

[Название файла: taskArray10.pas ]

Выбор элементов и сохранение в другой массив

Решение:

Как сделать рандом в паскале. Смотреть фото Как сделать рандом в паскале. Смотреть картинку Как сделать рандом в паскале. Картинка про Как сделать рандом в паскале. Фото Как сделать рандом в паскале
Вывод массива B:

writeln(‘Выбранные элементы’); for i:=1 to count-1 do write(B[i], ‘ ‘)

[Название файла: taskArray11.pas ]

Сортировка элементов массива

Как сделать рандом в паскале. Смотреть фото Как сделать рандом в паскале. Смотреть картинку Как сделать рандом в паскале. Картинка про Как сделать рандом в паскале. Фото Как сделать рандом в паскале

for i:=1 to N-1 do begin for j:=N-1 downto i do if A[j] > A[j+1] then begin с := A[j]; A[j] := A[j+1]; A[j+1] := с; end; end;

[Название файла: taskArray12.pas ]

Как сделать рандом в паскале. Смотреть фото Как сделать рандом в паскале. Смотреть картинку Как сделать рандом в паскале. Картинка про Как сделать рандом в паскале. Фото Как сделать рандом в паскале

PascalPascalABC.NET

for i := 1 to N-1 do begin min:= i ; for j:= i+1 to N do if A[j] i then begin c:=A[i]; A[i]:=A[min]; A[min]:=c; end; end;

for var i := 0 to a.High-1 do begin var (min,imin) := (a[i],i); for var j := i + 1 to a.High do if a[j] [Название файла: taskArray13.pas ]

Как сделать рандом в паскале. Смотреть фото Как сделать рандом в паскале. Смотреть картинку Как сделать рандом в паскале. Картинка про Как сделать рандом в паскале. Фото Как сделать рандом в паскале

Рубрики:

См. пузырьковая сортировка.
При второй итерации цикла (согласно вашим рисункам и коду ) нет надобности сравнивать первый элемент со вторым. Снова вы всех путаете =)

admin

Именно поэтому в коде : for j:=N-1 downto i do

downto i — то есть мы доходим сначала до первого элемента, потом до второго и т.д.

Bronislav

Смотрите. Ваш код работает. Но работает не так, как вы пишете перед этим. Он просеивает минимальный элемент с конца через весь массив до первой позиции (первого индекса если хотите). А не так как вы пишете: «При второй итерации цикла нет надобности сравнивать последний элемент с предпоследним. Последний элемент уже стоит на своем месте, он самый большой.» Соответственно вашему коду и вашим рисункам на второй итерации не сравнивается первый элемент (минимальный) со вторым, а не последний (который вообще не факт что максимальный) с предпоследним. Вот об чем речь. Или код меняйте или описание алгоритма перед кодом.

Владимир

В сохранении в другой массив ошибка. Надо поменять местами счётчик и команду сохранения. В массиве В нет элемента 0.

Aurangzeb

А как заполнить случайными числами (из файла!) такой массив: Type mass=array[1..n] of smallint; var A:array[1..n] of mass… В файле они введены, допустим, квадратно! Потом её нужно перевернуть и записать в выходной файл! Подумайте!

Как распечатать в строку элементы одномерного массива по 5 значений?

Источник

Random и Randomize

Подпишись на новости, чтобы ничего не пропустить

Функция Random генерирует и возвращает случайное число. Синтаксис функции следующий:

Функция возвращает случайное число большее или равное 0 и строго меньше L (то есть L не входит в диапазон возвращаемых значений). Если параметр опущен (последний вариант из трёх приведённых выше), то возвращается вещественное число между 0 и 1 (0 включительно, 1 не входит в диапазон возвращаемых значений).

Математически это можно записать так:

ПРИМЕЧАНИЕ
FreePascal использует в процедуре Random имитацию случайностей Мерсенна Твистера. Эта реализация имеет большее статистическое распределение, чем, например, алгоритм Линейного Конгруэнтного генератора, но работает значительно медленнее, чем последний. Если скорость выполнения программы критична, то должны быть рассмотрены альтернативные генераторы случайных чисел.

Процедура Randomize в Паскале запускает генератор случайных чисел. Синтаксис:

Процедура Randomize инициализирует генератор случайных чисел FreePascal, задавая значение переменной Randseed, вычисленное с помощью системных часов.

Как запустить генератор случайных чисел в Паскале

Пример программы, где используются разные варианты получения случайных чисел, приведён ниже:

ВАЖНО!
Перед использованием функции Random надо обязательно вызвать процедуру Randomize, чтобы запустить генератор случайных чисел. Иначе функция Random будет возвращать НЕ случайное число.

Процедура Randomize вызывается ТОЛЬКО ОДИН РАЗ в начале программы. Типичная ошибка новичков заключается в том, что они вызывают Randomize перед каждым вызовом Random. Этого делать не надо.

Что такое Randseed

Давайте сначала попробуем не использовать процедуру Randomize. Например, так:

В этом примере функция Random будет возвращать какое-то значение, но оно НЕ будет случайным числом. Сколько бы раз вы не запускали программу, она всегда будет выводить одинаковые числа.

В моём случае это были числа 54 и 59. В вашем случае это могут быть другие числа, но суть не в этом, а в том, что они будут всегда одинаковыми.

Теперь попробуем сделать так:

Теперь числа будут другими. В моём случае 69 и 7. Правда, они тоже не будут изменяться, то есть не будут случайными.

Однако эти числа изменились. Потому что мы изменили значение глобальной переменной Randseed.

Эта переменная задаёт начальное значение для генератора случайных чисел. Опираясь на это значение функция Random генерирует случайное число. Но, если значение переменной Randseed будет всегда одинаковым, то никаких случайных чисел мы не получим.

Поэтому при запуске программы надо хотя бы один раз вызвать процедуру Randomize, которая устанавливает начальное значение переменной Randseed, получая системное время и из этих данных формируя значение для переменной Randseed.

Так как программа запускается в какое-то случайное время, то и значение переменной Randseed будет случайным. А, следовательно, и функция Random будет возвращать случайные значения.

Давайте попробуем написать свою процедуру Randomize. Она может быть, например, такой:

Я не буду в подробностях разъяснять работу процедуры DecodeTime. Скажу только, то она возвращает, час, минуту, секунду и миллисекунду текущего времени компьютера. Мы используем миллисекунду, значение которой и присваиваем переменной Randseed.

Можете попробовать использовать эту процедуру вместо стандартной процедуры Randomize и убедиться, что функция Random возвращает случайные значения. Не забудьте подключить к программе модуль SysUtils, в котором объявлена процедура DecodeTime, иначе программа не откомпилируется.

ПРИМЕЧАНИЕ
Исходя из того, что процедура Randomize задаёт начальное значение переменной Randseed на основе текущего времени компьютера, можно предположить, что, например, если запустить программу сегодня в 12:00:00 и завтра в это же время, то функция Random вернёт одинаковые числа.

К сожалению, проверить это очень трудно, так как запустить программу в одно и то же время с точностью до миллисекунды будет практически невозможно.

Источник

Разработчику о работе с 1С:Предприятие, Pascal, Паскаль

Pascal (Паскаль) функция Random, процедура Randomize.

Pascal (Паскаль) функция Random, процедура Randomize.
1. Общие сведения.
Функция Random в Паскале определяет диапазон случайных чисел.

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

Добавим в наш код возможность повторения кода, то есть вводим цикл while. Так же удалим (комментарий) процедуру Randomize.

Код только Random.

Скомпилируем наш код. Запускаем несколько раз полученную программу Код только Random (без Randomize). При каждом запуске, в окне увидим один и тот же ряд чисел.

Результат работы кода только один Random.

Убираем комментарий, вводим оператор Randomize. Снова компилируем, теперь выводится новый ряд чисел при каждом запуске программы.
Вывод: Генератор псевдослучайных числ работает только с функцией Random и процедурой Randomize вместе.

2. Использование параметра Random.
Набираем такой код:

Компилируем программу — выскакивает ошибка:

Ошибка компиляции функция Random.

Почему возникла ошибка компиляции?
Функция Random без параметров возвращает тип значения real в интервале [0…1]. А переменная sN тип integer. Изменим ее тип на real.
Компиляция прошла без ошибок.

Random без указания параметра.

Ошибка возникла потому, что язык Паскаль является строго типизированным. Нельзя присваивать переменной типа Integer, значение другого типа.

Если необходимо получить не только значения целых чисел в определенном интервале, но и значения вещественных чисел в определенном интервале, например [0…10], перепишем код:

Random вывод вещественных чисел в интервале от 0 до 10.

Function Random [ ( sN : Word) ] : тип параметра;
Возвращает:
Если sN неопределенный, тогда значение случайного числа от 0 до 1, включая ноль.
Если sN определенный, тогда значение случайного числа от 0 до sN. включая ноль.

Источник

Как сделать рандом в паскале

Как сделать рандом в паскале. Смотреть фото Как сделать рандом в паскале. Смотреть картинку Как сделать рандом в паскале. Картинка про Как сделать рандом в паскале. Фото Как сделать рандом в паскале

Random без повтора чисел

Еще в прошлом году мы познакомились со стандартным оператором рандом, отвечающим за генерацию случайных чисел. Оператор очень полезный, так как нам не приходится лично вбивать данные с клавиатуры или подключать файлы с массивами данных. Однако у рандома как оператора есть один маленький минус: так как числа берутся случайно и ограничение имеют только в диапазоне, то они могут повторятся. Конечно, кого-то это устраивает, однако для некоторых это проблема, которую приходится решать самому. Совсем недавно меня попросили написать как можно более простую программу, в которой random выводил бы числа так, чтобы ни одно число не повторялось. На самом деле сделать это просто. Как мы знаем, оператор random выводит случайные числа и они могут повторяться.

Особенно это видно при задании узкого диапазона, например если вывести 10 элементов массива, заполнив их случайными числами в диапазоне от 0 до 9, то среди них почти всегда есть повторы. Ниже код реализации.

var
m: array [1..n] of integer;
i:integer;

begin
randomize;
for i := 1 to n do
begin
z: m[i] := random(1, 10);
write(m[i]);
end;
end.

Шаг 1.Заполняем первый элемент массива

Шаг 2.Заполняем второй элемент

Подшаг 1. Сверяем его с первым.

Шаг 3. Заполняем третий элемент.

Подшаг 1. Сверяем его с первым.

а) Если элементы разные, то переходим к следующему подшагу.
б) Если они одинаковы, то заполняем третий элемент еще раз до тех пор, пока они не будут неравными.

Подшаг 2. Сверяем его со вторым.

а) Если элементы разные, то переходим к следующему шагу.
б) Если они одинаковы, то заполняем третий элемент еще раз до тех пор, пока они не будут неравными.

Как сделать рандом в паскале. Смотреть фото Как сделать рандом в паскале. Смотреть картинку Как сделать рандом в паскале. Картинка про Как сделать рандом в паскале. Фото Как сделать рандом в паскале

Random без повтора чисел

На картинке изображен момент, когда шаг равен 3 и происходит сначала сравнение третьего элемента и первого, а затем третьего и второго. И таким вот образом алгоритм повторяется от первого щага до десятого. Каждый раз, когда мы делаем i шагов, мы делаем i-1 подшагов.

А теперь весь алгоритм. Для алгоритма был использован оператор goto. О нем я уже упоминал в статье выход из цикла. Итак код алгоритма

randomize;
for i := 1 to n do
begin
z: m[i] := random(1, 10);
for k := 1 to i — 1 do
if m[k] = m[i] then goto z;
end;

Полный код с выводом сгенерированных элементов массива на экран.

var
m: array [1..n] of integer;
i, k: integer;

begin
randomize;
for i := 1 to n do
begin
z: m[i] := random(1, 10);
for k := 1 to i — 1 do
if m[k] = m[i] then goto z;
end;

Тот же код, но без использования метки.

var
m: array [1..n] of integer;
i, k: integer;

begin
randomize;
i := 0;
while i

Спасибо за статью ) Всегда с удовольствием читаю ваши посты

Группа: Гости
Публикаций: 0
Комментариев: 0

Здравствуйте, хотелось бы уточнить, используете ли Вы всегда только PascalABC.net для своих программ? Дело в том, что TurboPascal почему-то «ругается» на массив, когда я ввожу тот же самый код программы, что и у Вас. При запуске программы получаю сообщение об ошибке «type mismatch».

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

PascalPascalABC.NET