Страница 1 из 1

Команда random&randomize.

СообщениеДобавлено: 07.10.2012 22:51:33
deka47
Здравствуйте, дорогие друзья, меня заинтересовало программирование и я решил начать с прочтения книги "Песни о Паскале", дошел до 110 страницы, все было ясно, но вот немножко застрял на командах random and randomize.

В книге дан пример программы с random и вот, что пишет об этой команде:
Запустите эту программу еще пару раз и сравните результаты. Вы заметили, что они повторяются? Так и должно быть! Все потому, что функция Random
создает псевдослучайную последовательность чисел. «Псевдо» – значит «не совсем случайную».
Вот в чем проблема, я запускал много раз, мне всегда с 5 команд random выводило разные числа и они не повторялись.

А вот что пишет о randomize:
Randomize (что значит «уравнять шансы» или «перемешать») и не требует параметров. Вызвав эту процедуру единожды в начале программы, мы смешаем карты и заставим функцию Random при повторных запусках программы генерировать разные последовательности чисел.

Я так и не понял разницу между этими двумя командами, что та, что та выдавала мне разные цифры, пожалуйста, обьясните мне.

И еще один вопрос не по теме, вот я написал программу:
var A, B, C : integer;
r: boolean;
begin
Randomize;
repeat
A:= 1+ Random(10); B:= 1+ Random(10);
Write('Сколько будет ', A,' x ',B, ' ? ');
readln (c);
if с=0 then break;
r:=c=a*b;
if r
then Writeln('Молодец правильно')
else Writeln('Ошибка, повтори таблицу умножения');
until false;
writeln ('Good bye!');
end.

Все работает, но как сделать так, чтобы она выключалась при вводе команды "Stop", а не "0". Я это сделать не могу, потому что пытаюсь присвоить "с" типу integer тип string. Вводить другую сменную "q", к примеру, тоже как-то не вариант, потому что я там не могу просто заменить if с=0 then break; на if q='Stop' then break; я не знаю где мне поставить readln(q) или что сделать, чтобы я смог выключать ее словом, а не цифрой?

Огромное Вам спасибо, с уважением начинающий программист Владислав.

Re: Команда random&randomize.

СообщениеДобавлено: 08.10.2012 00:18:02
andrey_k3
может не совсем красиво, но как вариант:
var A, B, C : integer;

q:string;

r: boolean;
begin
Randomize;
repeat
A:= 1+ Random(10); B:= 1+ Random(10);
Write('Сколько будет ', A,' x ',B, ' ? ');

readln (q); //считываем вводимые символы в строку
if q='stop' then break else c:= strtoint(q); //если не stop - конвертируем в число

r:=c=a*b;
if r
then Writeln('Молодец правильно')
else Writeln('Ошибка, повтори таблицу умножения');
until false;
writeln ('Good bye!');
end.

Re: Команда random&randomize.

СообщениеДобавлено: 08.10.2012 02:47:34
Vadim
deka47 писал(а):Вот в чем проблема, я запускал много раз, мне всегда с 5 команд random выводило разные числа и они не повторялись.

1. Это вопрос к разработчикам FreePascal ;)
2. Нужно ввести дополнительную переменную, типа String и сравнивать её с константой 'stop'.

Re: Команда random&randomize.

СообщениеДобавлено: 08.10.2012 03:35:47
Максим
deka47 писал(а):Вот в чем проблема, я запускал много раз, мне всегда с 5 команд random выводило разные числа и они не повторялись.

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

Результат выполнения вашей программы с убранным вызовом Randomize это прекрасно демонстрирует:
Код: Выделить всё
i:\Fptest>randomizetest.exe
How much is 6 x 6 ? 36
OK
How much is 8 x 9 ? 72
OK
How much is 7 x 9 ? 63
OK
How much is 6 x 9 ? 54
OK
How much is 5 x 7 ? 35
OK
How much is 7 x 4 ? 28
OK
How much is 5 x 3 ? 15
OK
How much is 9 x 1 ? 0
Good bye!

i:\Fptest>randomizetest.exe
How much is 6 x 6 ? 36
OK
How much is 8 x 9 ? 72
OK
How much is 7 x 9 ? 63
OK
How much is 6 x 9 ? 54
OK
How much is 5 x 7 ? 35
OK
How much is 7 x 4 ? 28
OK
How much is 5 x 3 ? 15
OK
How much is 9 x 1 ? 9
OK
How much is 10 x 3 ? 0
Good bye!

i:\Fptest>randomizetest.exe
How much is 6 x 6 ? 36
OK
How much is 8 x 9 ? 72
OK
How much is 7 x 9 ? 63
OK
How much is 6 x 9 ? 54
OK
How much is 5 x 7 ? 35
OK
How much is 7 x 4 ? 28
OK
How much is 5 x 3 ? 15
OK
How much is 9 x 1 ? 9
OK
How much is 10 x 3 ?

Re: Команда random&randomize.

СообщениеДобавлено: 09.10.2012 00:40:35
deka47
Всем спасибо, понял как сделать остановку словом и разницу между процедурами!

Re: Команда random&randomize.

СообщениеДобавлено: 09.10.2012 05:05:22
sign
deka47, пользуйтесь оформлением своих примеров посредством команды Code.
Смотрите, насколько читабельней ваш пример:
Код: Выделить всё
var A, B, C : integer;
  r: boolean;
begin
  Randomize;
  repeatA:= 1+ Random(10);
    B := 1+ Random(10);
    Write('Сколько будет ', A,' x ',B, ' ? ');
    readln (c);
    if с=0 then break;
    r := c=a*b;
    if rthen Writeln('Молодец правильно')
    else Writeln('Ошибка, повтори таблицу умножения');
  until false;
  writeln ('Good bye!');
end.

Re: Команда random&randomize.

СообщениеДобавлено: 09.10.2012 07:59:29
Paster Fob
deka47Для вопросов связанных с обучением по книге "Песни о Паскале",есть специальный раздел на форуме
http://freepascal.ru/forum/viewforum.php?f=45

Re: Команда random&randomize.

СообщениеДобавлено: 10.10.2012 22:28:45
deka47
Спасибо, буду пользоваться этой функцией.
Извините, создал тему и аж потом увидел, что есть раздел с этой книгой и уже не хотел дублировать.