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

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


Часто в задачах требуется выполнить различные действия с большим количеством чисел. В таких случаях вводить все числа становится просто неудобно и долго. Для этого в Паскале придуман генератор случайных чисел - оператор random. От программиста лишь требуется задать числовые промежутки ( например от 2 до 50 ) , все остальное программа выполнит сама. Итак как добавить к коду программы оператор random .
Для начала необходимо предварительно описать оператор (то есть фактически мы сообщаем программе , что будет использован генератор случайных чисел ). Для этого необходимо ввести оператор randomize в промежутке после begin и до random (обычно оператор randomize ставят сразу после begin , так как это упрощает чтение кода ) . Затем идет присвоение оператора random к выбранной переменной. Делается это так:
Для Turbo Pascal
оператор:= random (max-min+1)+min;

- оператор - любая переменная
- min - целое число , не превышающее max
- max - целое число, большее min
Здесь min и max являются диапазонами генератора случайных чисел. Теперь для наглядности пример генератора случайных чисел от 2 до 5 .
var x:integer;
begin
randomize;
x :=random (4)+2;
end;

Здесь 4 - это результат выражения 5-2+1.
Для Pascal ABC
Здесь можно применять оператор random так же как и для Turbo Pascal , однако есть еще один вариант , более простой в использовании.
оператор:= random (max,min);

- оператор - любая переменная
- min - целое число , не превышающее max
- max - целое число, большее min
Чтобы разница лучше просматривалась решим тот же пример генератора случайных чисел от 2 до 5 этим способом.
var x:integer;
begin
randomize;
x :=random (2,5);
end;

Как уже стало заметно второй способ гораздо проще, однако его можно использовать только в Pascal ABC. А для тех , кого интересует код программы , где используется рандом без повтора генерируемых чисел я написал этот пост . В нем при генерации каждого числа происходит сравнение с предыдущем числом .
Понравилась новость? Добавь в закладки!
Хочешь получать свежие новости? Подпишись на обновления с сайта!
Рекомендуем посмотреть:
#1 | написал: Балдёжник | 30 октября 2011 16:51 | ICQ: |

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

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

 "Ошибка: функция random c параметрами указанных типа не найдена".

Почуму так?


#2 | написал: Mr.Cheater | 30 октября 2011 17:22 | ICQ: 360239964 | Пользователь offline

Группа: Администраторы
Публикаций: 32
Комментариев: 64

Приведите пример Вашего кода ,будем разбиратся
У меня все работает на ура.


#3 | написал: Палач | 5 января 2012 20:34 | ICQ: |

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

Спасибо, все работает!


#4 | написал: Mr.Cheater | 5 января 2012 20:45 | ICQ: 360239964 | Пользователь offline

Группа: Администраторы
Публикаций: 32
Комментариев: 64

Не за что )
Для Вас и пишем) 


#5 | написал: Genius | 11 февраля 2012 18:20 | ICQ: |

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

Хоу! Если не сложно напишите кодик чтобы рандом генерировал числа в интервале не повторясь! Если не сложно! Желательно самый простой вариант!


#6 | написал: Mr.Cheater | 14 февраля 2012 13:47 | ICQ: 360239964 | Пользователь offline

Группа: Администраторы
Публикаций: 32
Комментариев: 64
label m;
const
  l = 10;
var
  s: array [1..l] of integer;
  i, k: integer;
begin
 {начало алгорима}
  randomize;
  s[1] := random(1, 10);
  for i := 1 to l do 
  begin
    m: s[i] := random(1, 10);
    for k := 1 to i - 1 do
      if s[k] = s[i] then goto m;
  end;
  {конец алгоритма}
  for i := 1 to l do
    write(s[i]:3);
end.

#7 | написал: Ксения | 16 марта 2012 23:38 | ICQ: |

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

Здравствуйте!А можете написать програмку с random  для Turbo Pascal :генератор случайных чисел.Причем нужно сравнивать с предыдущими числами, и в графике.)

Буду бесконечно признательна Вам!!!


#8 | написал: Mr.Cheater | 17 марта 2012 13:29 | ICQ: 360239964 | Пользователь offline

Группа: Администраторы
Публикаций: 32
Комментариев: 64

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


#9 | написал: Ксения | 18 марта 2012 23:05 | ICQ: |

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

Текста,к сожалению,нет.

Точно знаю,что числа должны  равномерно распределяться в [0,1]. Как нам объясняли,здесь нужно сравнивать с предыдущими случайными числами. И изобразить графически...наверно,используя Graph (grDriver:=Detect;InitGraph...)

..вот всё,что у меня есть((


#10 | написал: Mr.Cheater | 21 марта 2012 17:20 | ICQ: 360239964 | Пользователь offline

Группа: Администраторы
Публикаций: 32
Комментариев: 64

Ксения,
Я так понял,что Ваша задача аналогична той ,что была у Genius.
Так что ее решение уже есть . Код я писал тут в комментариях,посмотрите выше. Разбор задачи в этом посте. Но я не работаю с графикой,так что оставшуюся часть задачи вам придется решать самой


#11 | написал: Ксения | 25 марта 2012 20:41 | ICQ: |

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

Спасибо большое!Буду разбираться"!


#12 | написал: Mr.Cheater | 26 марта 2012 15:28 | ICQ: 360239964 | Пользователь offline

Группа: Администраторы
Публикаций: 32
Комментариев: 64

Ксения,
Не за что)


#13 | написал: Анюта | 20 мая 2012 01:23 | ICQ: |

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

Пожалуйста, помогите разобраться, выдает ошибку:(

"Ошибка: функция random c параметрами указанных типа не найдена".

 

const n=15;
type mas = array[1..n] of integer;tx=text;
procedure zap(var a:mas;x,y:integer);
var i:integer;
begin
randomize;
for i:=1 to n do
a[i]:=random(x,y);
end;
procedure vivod(a:mas);
var i:integer;
begin
for i:=1 to n do
write(a[i]:4);
writeln;
end;
procedure iniz(var a:mas);
var i:integer;
begin
for i:=1 to n do
a[i]:=0;
end;
procedure udal(var a:mas;k:integer);
var i:integer;
begin
if k=1 then
begin
for i:=k to (n-1) do
a[i]:=a[i+1];
a[n]:=0
end else
if k=n then a[n]:=0 else
begin
for i:=k to (n-1) do
a[i]:=a[i+1];
a[n]:=0;
end;
end;
procedure masintext(a:mas;var f:tx);
var i,p:integer;
begin
assign(f,'G:\sr11.txt');
rewrite(f);
for i:=1 to n do
begin
p:=a[i];
write(f,p,' ');
end;
close(f);
end;
procedure masfromtext(var a:mas;f:tx);
var i,p,j:integer;
begin
assign(f,'G:\sr11.txt');
reset(f);
p:=1;
for j:=1 to n do
begin
read(f,i);
a[p]:=i;
p:=p+1;
end;
close(f);
end;
procedure per(var a:mas);
var i,k,m:integer;b:mas;
begin
readln(m);
b:=a;
i:=1;k:=1;
while i<>m do
begin
b[k+2]:=a[i+1];
b[2*i]:=a[m+i];
i:=i+1;
k:=k+2;
end;
b[2*m]:=a[2*m];
a:=b;
end;
var b,c:mas;
begin
zap(b,-50,50);
vivod(b);
per(b);
vivod(b);
end.


#14 | написал: Mr.Cheater | 20 мая 2012 13:55 | ICQ: 360239964 | Пользователь offline

Группа: Администраторы
Публикаций: 32
Комментариев: 64

под каким компилятором запускалась программа ? не turobo pacal случайно? в PascalABC работает на ура. 


#15 | написал: Анюта | 20 мая 2012 17:58 | ICQ: |

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

Нет, я тоже в PascalABC запускаю, странно


#16 | написал: Mr.Cheater | 20 мая 2012 20:08 | ICQ: 360239964 | Пользователь offline

Группа: Администраторы
Публикаций: 32
Комментариев: 64

попробуйте переустановить паскальабс


#17 | написал: deniscoll aim pro | 19 ноября 2012 01:40 | ICQ: |

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

а можно сделать так чтобы рандом  показал то число которое ты хочешь, ответь пожайлуста)))


#18 | написал: Mr.Cheater | 19 ноября 2012 18:09 | ICQ: 360239964 | Пользователь offline

Группа: Администраторы
Публикаций: 32
Комментариев: 64

deniscoll aim pro,
Вы подразумеваете, чтобы рандом выводим конкретно те числа, которые Вы хотите?
например 1,2,-10,59,43333,-3,3 ? 


#19 | написал: денис | 19 ноября 2012 21:12 | ICQ: |

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

да, например мне нужно выйграть в конкурсе, я 210 номер всего участвует 300 человек могу я сделать так чтобы когда жали на кнопку выходило 210?


#20 | написал: SumanDark | 20 ноября 2012 02:21 | ICQ: | Пользователь offline

Группа: Администраторы
Публикаций: 1
Комментариев: 4

Ну могу предложить такой способ для вашего случая, вот фрагмент:

writeln('Введите свой номер');
readln(n); 
while (x<>n) do
x:=random(300)+1;
writeln(' Случайный номер  ', x);

Довольно странная задача))) Рандом на то он и рандом, что выдает практически случайное число. 
 
 


#21 | написал: денис | 20 ноября 2012 14:56 | ICQ: |

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

а как этой формулой пользоваться, куда вводить?


#22 | написал: SumanDark | 22 ноября 2012 00:52 | ICQ: | Пользователь offline

Группа: Администраторы
Публикаций: 1
Комментариев: 4

всмысле как пользоваться? Вводить))) Куда вводить? Ну в любой угодный вам компилятор, для новичков сойдёт PascalABC. То, что я написал это основное тело программы) 


#23 | написал: Денис | 27 марта 2013 20:19 | ICQ: |

Группа: Гости
Публикаций: 0
Комментариев: 0
В общем у меня 1 главный вопрос: как сделать так чтоб максимальный элемент не повторялся? У меня задание в матрице обнулить строку и столбец, на пересечении которых стоит максимальный элемент. Программу то я сделал, все работает, Но: когда ввожу числа матрицы рандомно то зануляется строка и столбец на пересечении которых стоит ПЕРВЫЙ макс. элемент, помимо которого в матрице их есть еще несколько-некрасиво как то. Так вот как сделать чтоб он только 1 раз повторился?

#24 | написал: Mr.Cheater | 27 марта 2013 23:48 | ICQ: 360239964 | Пользователь offline

Группа: Администраторы
Публикаций: 32
Комментариев: 64
Денис,

в вашем случае можно попробовать несколько вариантов

1. увеличить диапазоны для рандомного числа
2. после того, как заполнили матрицу и наши максимальный элемент, пройтись по матрице заново и второй,третий,... максимальные элементы задать заново с условием того, что они будут меньше максимального
3. при заполнении матрицы ,заполнять ее сразу не повторяющимися элементами (подробнее смотрите статью http://programmado.ru/60-random-bez-povtora-chisel.html)


#25 | написал: asimо | 26 июня 2013 16:10 | ICQ: |

Группа: Гости
Публикаций: 0
Комментариев: 0
Здравствуйте подскажите пожалуйста,можно как ни будь вычислить закономерность и написать программу,если в неё записать,ну допустим 100-200 примеров чисел,чтоб алгоритм был ясен.Если есть мысли как это сделать,можете написать мне на емайл

#26 | написал: Mr.Cheater | 26 июня 2013 18:19 | ICQ: 360239964 | Пользователь offline

Группа: Администраторы
Публикаций: 32
Комментариев: 64
asimо,
нет, очень сомнительно, что это вообще реализуемо для любого набора чисел 
 
 

#27 | написал: Алексей | 27 июня 2013 14:49 | ICQ: |

Группа: Гости
Публикаций: 0
Комментариев: 0
Если вам не сложно можно попросить у вас обьеснить мне все об опреторе Random. Сдаю экзамен попадается вопрос оператор Random учитель спрашивает формула Random И задачу с произвольными числами что бы он выводил числа в промежутке если вы поможете буду очень вам признателен.

#28 | написал: Mr.Cheater | 28 июня 2013 13:46 | ICQ: 360239964 | Пользователь offline

Группа: Администраторы
Публикаций: 32
Комментариев: 64
Алексей,
Ну так прочитайте статью,для таких как вы она и писалась
формула random 
random (max-min+1)+min;
здесь min - это начало диапазона
max - конец диапазона
т.е если вы хотите ,чтобы диапазон был от 3 до 5,то
random(5-3+1)+3;
т.е
random(3)+3;

запись же вида
random(x) ;
будет означать диапазон от 0 до x-1



#29 | написал: Даниил | 15 декабря 2013 00:40 | ICQ: |

Группа: Гости
Публикаций: 0
Комментариев: 0
Надоело искать!( Долго-долго искал, а так и не нашел, может вы поможете

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

Спасибо

#30 | написал: Владимир | 5 февраля 2014 12:32 | ICQ: |

Группа: Гости
Публикаций: 0
Комментариев: 0
выводит ошибку: ожидалось имя процедуры или функции

Добавление комментария

Ваше Имя:
Ваш E-Mail:
Полужирный Наклонный текст Подчеркнутый текст Зачеркнутый текст | Выравнивание по левому краю По центру Выравнивание по правому краю | Вставка смайликов Выбор цвета | Скрытый текст Вставка цитаты Вставка исходного кода Преобразовать выбранный текст из транслитерации в кириллицу Вставка спойлера

Введите два слова, показанных на изображении: