Команда random&randomize.
Модераторы: Oleg_D, Модераторы
Команда random&randomize.
Здравствуйте, дорогие друзья, меня заинтересовало программирование и я решил начать с прочтения книги "Песни о Паскале", дошел до 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) или что сделать, чтобы я смог выключать ее словом, а не цифрой?
Огромное Вам спасибо, с уважением начинающий программист Владислав.
В книге дан пример программы с 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) или что сделать, чтобы я смог выключать ее словом, а не цифрой?
Огромное Вам спасибо, с уважением начинающий программист Владислав.
может не совсем красиво, но как вариант:
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.
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.
deka47 писал(а):Вот в чем проблема, я запускал много раз, мне всегда с 5 команд random выводило разные числа и они не повторялись.
1. Это вопрос к разработчикам FreePascal
2. Нужно ввести дополнительную переменную, типа String и сравнивать её с константой 'stop'.
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 ?
Всем спасибо, понял как сделать остановку словом и разницу между процедурами!
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.
- Paster Fob
- постоялец
- Сообщения: 188
- Зарегистрирован: 22.02.2011 20:53:36
- Откуда: Новосибирск.
deka47Для вопросов связанных с обучением по книге "Песни о Паскале",есть специальный раздел на форуме
http://freepascal.ru/forum/viewforum.php?f=45
http://freepascal.ru/forum/viewforum.php?f=45
Спасибо, буду пользоваться этой функцией.
Извините, создал тему и аж потом увидел, что есть раздел с этой книгой и уже не хотел дублировать.
Извините, создал тему и аж потом увидел, что есть раздел с этой книгой и уже не хотел дублировать.
