Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.12.2014, 09:32   #1
Dimidrolus
Дима)
Пользователь
 
Аватар для Dimidrolus
 
Регистрация: 05.06.2010
Сообщений: 30
По умолчанию random & randomize непонятки :)

добрый день. учу паскаль по книге "песни о паскале". использую среду pascalABC. в книге сказано, что
Код:
Запустите эту программу ещё пару раз и сравните результаты. Вы заметили,
что они повторяются? Так и должно быть! Всё потому, что функция Random
создает псевдослучайную последовательность чисел. «Псевдо» — значит «не
совсем случайную». Эта особенность функции полезна при отладке программ. Но в
экзаменующей программе надо получать разные последовательности чисел, иначе
смышленые школяры приноровятся к экзаменатору! Глава 15
Айда в Монте-Карло!
103
Этого можно добиться применением ещё одной процедуры. Она называется
Randomize (что значит «уравнять шансы» или «перемешать») и не требует
параметров. Вызвав эту процедуру единожды в начале программы, мы смешаем
карты и заставим функцию Random при повторных запусках программы
генерировать разные последовательности чисел. Итак, вставьте вызов процедуры
Randomize в начало программы и повторите опыты, запустив программу
несколько раз подряд.
но у меня и без randomize при каждой компиляции получаются разные числа. или это особенность среды абц?

и второй вопрос:
Код:
Теперь от успешного финиша проекта нас отделяет один шаг: придумаем
способ генерировать числа от 1 до 10 (а не от 0 до 9). Очевидно, что простое
арифметическое выражение решает эту проблему.
X:= 1+ Random(10); { генерация чисел от 1 до 10 }
а почему не просто x:= random(11); разве получится не тоже самое?) спасибо.
Dimidrolus вне форума Ответить с цитированием
Старый 27.12.2014, 09:45   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
у меня и без randomize при каждой компиляции получаются разные числа. или это особенность среды абц?
После перезапуска, если не делать randomize числа будут точно так же разные но точно такие же как и в предидущем запуске, поскольку случайное число считается относительно некоторого числа, зависящего в основном от даты, которое генерирует randomize.
Так то да - в рамках одного запуска числа будут случайными, но при перезапуске случайная последовательность не изменится.
Цитата:
разве получится не тоже самое?)
Нет не получится. random(10) будет генерировать числа в пределе [0,10).
Поэтому используют такие сдвиги как 1+ чтоб получить нужную последовательность.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.12.2014, 09:55   #3
WinCoder
Заблокирован
 
Регистрация: 24.11.2014
Сообщений: 721
По умолчанию

Цитата:
а почему не просто x:= random(11); разве получится не тоже самое?
Random[10] вернёт число в диапазоне 0 - 9
Random[11] вернёт число в диапазоне 0 - 10
Random[10] + 1 вернёт число в диапазоне 1 - 10. То что нужно по задаче.
WinCoder вне форума Ответить с цитированием
Старый 27.12.2014, 09:56   #4
Dimidrolus
Дима)
Пользователь
 
Аватар для Dimidrolus
 
Регистрация: 05.06.2010
Сообщений: 30
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
После перезапуска, если не делать randomize числа будут точно так же разные но точно такие же как и в предидущем запуске, поскольку случайное число считается относительно некоторого числа, зависящего в основном от даты, которое генерирует randomize.
Так то да - в рамках одного запуска числа будут случайными, но при перезапуске случайная последовательность не изменится.

Нет не получится. random(10) будет генерировать числа в пределе [0,10).
Поэтому используют такие сдвиги как 1+ чтоб получить нужную последовательность.
с +1 понял)) отталкивает от нуля плюс 1))
написал такой проверятель таблички умножения. без процедуры рандомайз. но все равно всегда разные числа. что не так?
Код:
var a,b,c: integer; r: boolean;
begin
repeat
a:=1+random (9); b:=1+random(9);
writeln ('how much ', a ,'x', b,'?');
readln (c);
r:=c=a*b;
if c=0 then break;
if r then writeln (' krasavchik bratish') else
writeln ('loshara');
until false;
end.
Dimidrolus вне форума Ответить с цитированием
Старый 27.12.2014, 10:00   #5
WinCoder
Заблокирован
 
Регистрация: 24.11.2014
Сообщений: 721
По умолчанию

Цитата:
что не так?
Запустите программу ДВА раза, и сравните полученные значения от обоих запусков.
WinCoder вне форума Ответить с цитированием
Старый 27.12.2014, 10:01   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
се равно всегда разные числа
Если и после перезапуска числа точно такие же как и были значит паскальАБЦ сам рандомизатор включает.

P.S. Неверно сказал: Если после перезапуска последовательности разные значит рандомизатор включается по умолчанию.
I'm learning to live...

Последний раз редактировалось Stilet; 27.12.2014 в 11:18.
Stilet вне форума Ответить с цитированием
Старый 27.12.2014, 10:03   #7
Dimidrolus
Дима)
Пользователь
 
Аватар для Dimidrolus
 
Регистрация: 05.06.2010
Сообщений: 30
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Если и после перезапуска числа точно такие же как и были значит паскальАБЦ сам рандомизатор включает.
вот я тоже об этом подумал и спросил может это особенность среды))) при каждом запуске программы или при работе цыкла цифры все равно разные. спасибо
Dimidrolus вне форума Ответить с цитированием
Старый 27.12.2014, 20:29   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Ребята, не сорьтесь.
PascalABC randomize делает сам, автоматически, это его фича.

Dimidrolus, возьмите нормальный компилятор Паскаля (либо антикварную классику - Turbo Pascal, либо современные FreePascal/ Delphi), там и проверяйте.

Либо просто пользуйтесь PascalABC, и ожидайте новых сюрпризов (к сожалению, не всегда таких приятных )
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.01.2015, 01:28   #9
FIDE
Заблокирован
 
Регистрация: 02.08.2014
Сообщений: 30
По умолчанию

Цитата:
Либо просто пользуйтесь PascalABC, и ожидайте новых сюрпризов (к сожалению, не всегда таких приятных )
Не хочу разводить флуд, но имхо, лучше писать в Free Pascal - он ближе к классическому Turbo,но при этом он современный и имеет много фич.
FIDE вне форума Ответить с цитированием
Старый 04.01.2015, 01:43   #10
Dimidrolus
Дима)
Пользователь
 
Аватар для Dimidrolus
 
Регистрация: 05.06.2010
Сообщений: 30
По умолчанию

Цитата:
Сообщение от FIDE Посмотреть сообщение
Не хочу разводить флуд, но имхо, лучше писать в Free Pascal - он ближе к классическому Turbo,но при этом он современный и имеет много фич.
Уже перешел на него На нем удобней даже)
Dimidrolus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Randomize alman12 Общие вопросы Delphi 37 15.09.2014 10:16
Randomize в С++ Falcao Visual C++ 3 06.03.2013 13:27
Random и Randomize Heng Помощь студентам 12 14.12.2012 23:14
random/randomize Ya_Aston Помощь студентам 8 17.12.2010 19:49
TForm & TImage & PNG & Прозрачность delphi_beginner Общие вопросы Delphi 7 19.09.2009 08:46