УРОК 6
б. 1 Случайные числа.
Функция, которая может выдавать случайные числа, лежит в
основе большинства игровых программ и программ-имитаторов. Она
позволяет вносить эффект неожиданности в игру и делает програм-
му развлекательной.
Со случайными числами вы встречаетесь очень часто. Это и
результата, выдавите на кубиках костей и результат бросания
нонета и даже ритуальная жеребьевка участников финала чемпиона-
та мира по футболу, все ны. конечно же, имеем интуитивное пред-
ставление о том. что такое случайные числа, но, как Оказалось,
очень трудно с Формулировать эту концепцию настолько четко, что-
бы поручить их поиск компьютеру. Давайте рассмотрим некоторые
числовые последовательности. Перед вами результата трех мыслен-
ных экспериментов по бросанию шестигранного кубика 15 раз.
А: 5, 1, 2. 4. б. 3. 2. 1. б. 3. 5. 4. 3. 4. 2
В: б, 6. б. б. б. б. 6. б. 6.6. б. б. 6. б. б
с: 1.2.3.4.5.6.1.2.3.4.5.6.1,2.3
случайны ли эти последовательности?
Большинство из нас будут вполне удовлетворены последова-
тельностью А. Кажется, что числа в последовательности не обра-
зуют никаких повторяющихся комбинаций и. кажется, что все числа
в ней появляются с равной вероятностью.
напротив, последовательность в выглядит совсем нереальной,
нр никак не ожидаем, что в пятнадцати бросках кубика "шестерка*
выпадет пятнадцать раз подряд, если такое случится, мы начнем
подозревать нечестную игру и попробуем взвесить кость, чтобы
узнать, не смешен ли у нее центр тяхести. а мохет быть будем
искать под столон магнит.
Итак, интуитивно ны готовы поверить в то, что последова-
тельность А произошла случайно, но совсем не готовы признать то
хе за последовательбностью В.
ны еше знаем о случайных числах из хизненного опыта, что в
достаточно длинных последовательностях частоты повторения от-
дельных событий к^к бы сглахиваются. имеется в виду, что после
ста бросков мы долхны иметь около 16 единиц, около 16 двоек,
около 16 троек и т.д. Другими словами, мы рассчитываем, что в
длинных последовательностях начнут проявляться законы вероят-
ности. Если теперь мы рассмотрим последовательность "С" с этой
8 - 6613
точки зрения и как бы продолжим ее на 100 бросков: ... 6.1, 2,3,
4, 5. б. 1.2... то она с этой точки зрения будет выглядеть вполне
благопристойно. Но, тем не менее, мы не можем интуитивно при-
знать эту последовательность случайной, поскольку мы не верим в
то. что комбинация 1. 2. 3,4. 5. б... может повтряться раз за
разом.
Но интуиция это субъективный Фактор. V одного она такая, а
у другого нет. Должны быть какие-то объективные математические
критерии для оценки того, можно ли считать данную последова-
тельность чисел случайной или нет. И такие методы в математи-
ческой статистике есть, хотя мы их рассматривать не будем.
поскольку они не относятся к теме нашей книги.
Компьютер - машина, требуюшая полной определенности. Поэ-
тому мы сталкиваемся с парадоксом. Даже для того, чтобы выдать
нам .СЛУЧАЙНУЮ последовательность чисел, в него надо вложить
вполне ОПРЕДЕЛЕННУЮ программу. Для наших целей мы будем пола-
гать, что таблица случайных чисел уже имеется в памяти компью-
тера. Эта последовательность весьма длинная и пройдет немало
времени, прежде чем она начнет повторяться, чтобы при разных
запусках прогрэмны эта последовательность была различной, можно
менять начальную точку, с которой начинается считывание данных
из этой последовательности. Поскольку рано или поздно эта по-
следовательность начнет повторяться (как говорят математики -
вырождаться), то мы все же имеем дело не со случайной последо-
вательностью. а с псевдослучайной.
6. 2 функция RHD.
Если Вы запустите следующую програмну. то увидите резуль-
. ат работы функции rhd.
10 REH ««Генерация днсяти случайных чисел»«
30 FOR 1 ТО 10
30 LET b=RHD
40 PRIHT b
50 NEXT К
Типичный результат ее работы таков:
О. 98448181
0. 8361^112
О. 71151733
О. 35412048
О. 30975342
О. 23228455
О. 42221069
О. 66645813
О. 98474121
О. 85560608
Эта последовательность определенно выглядит как последова-
тельность случайных чисел. Если Вы нажмете RUH. то почти навер-
няка получите иную последовательность. На самом деле компьютер
способен выдать список из 65536 чисел. А Функция RHD "врезает-
ся" в этот список и читает столько чисел, сколько ван надо.
Тот Факт, что случайные числа выдаются в "жесткой" после-
довательности означает, что если мы захотим повторить случайную
последовательность еше раз и точно в таком же виде, то это
можно сделать, на "Спектруме" для этого служит оператор
RAHDOHIZE (сокращенно RAND). например, команда RAHDOHIZE 25
начнет читать случайную последовательность с 25-го числа. По-
пробуйте запустить следующую программу и убедитесь в том, что
RAHDOHIZE действительно Фиксирует начальную точку последова-
тельности.
10 REH ««Фиксированная случайная последовательность»»
20 RAHDOHIZE 7
30 REH »«Начало цикла»»
40 FOR К=1 ТО 10
50 LET b=RHD
60 PRIHT b
70 HEXT К
Запустите эту программу нсколько раз и сравните результаты:
О. 0091400146
О. 68663025
О. 49761963
О. 32203674
О. 15351868
О. 51486206
О. 61520386
О. 14071655
О. 55471802
О. 60435486
итак, проведенное нами исследование показало, что RHD дает
случайные числа в диапазоне О. . . 1 (причем О - включается, а 1 -
исключается), как нам расширить этот диапазон? Это делается
просто - RHD умножается на нужное нам число:
RHD дает случайное число в диапазоне О. . . 1
6»RHD дает случайное число в диапазоне О. . . 6
„ас 52«RND дает случайное число в диапазоне о... 52 и т. д.
Нижеследующая программа продемонстрирует Вам эту идею:
20 PRIHT " К"; TAB 8;~1«ИП>";ТЛВ20: "6»ИГО*
30 PRIHT " — ";ТЛВ 8;"------;ТАВ 20;"-----•
40 REH ««
50 FOR К=1 ТО 10
60 LET b=RHD
70 LET С = 6«Ь
80 PRIHT К; TAB 8; b; TAB 20; С
90 НЕХТ К
100 STOP
Результат:
RUH
К 1»RHD 6»RHD
1 0. 62315369 3. 7389221
2 0. 73695374 4.4217224
3 0.27182007 1.6309204
4 0. 3873291 2. 3239746
5 0.050369263 0.30221558
6 0. 77877808 4. 6726685
7 0.40859985 2.4515991
8 0. 6456604 3. 8739624
9 0. 42492676 2. 5495605
10 0.87016296 5.2209778
Изменим строку 70 и заголовок в строке 20:
20 PRIHT " К";TAB 8;"1*RHD"; ТАВ20; "52«RHD"
30 PRIHT "---": TAB 8;"-----"; TAB 20;"-----"
40 REH ««цикл генерации случайного числа««
50 FOR К=1 ТО 10
60 LET b=RHD
70 LET C=52»b
80 PRIHT 1; TAB 8; b; TAB 20; с
90 НЕХТ К
100 STOP
RUH
К 1»RHD 52»RHD
1 0. 65000916 33. 800476
2 0. 75108337 39. 056335
3 0.33152771 17.239441
4 0.86534119 44.997742
5 |
0. 90074158 |
46. 838562 |
6 |
0. 5557251 |
28. 897705 |
7 |
0. 67988586 |
35. 354065 |
8 |
0. 99180603 |
51. 573914 |
9 |
0. 38545227 |
20. 043518 |
10 |
0. 90962219 |
47. 300354 |
Нашшите программу для печати шести случайных чисел
в диапазоне О.. . 5, 999999.
Взглянем еше раз на результат работы 6«RHB:
3. 7389221
4.4217224
1. 6309204
2, 3239746
О. 30221558
4. 6726685
2. 4515991
3. 8739624
2. 5495605
5. 2209778
Посмотрим на целые части чисел в этой последовательности:
3.4,1.2,0.4,2,3.2.5. Все это случайные числа из набора (О. ..5).
Но ведь когда мы бросаем кость, то получаем числа из. набо-
ра (1.2,3.4,5.6). Итак, нан нухно добавить по единице ко всем
числам первого набора, чтобы получить второй. Поэтому, когда мы
в играх бросаем кость (6 возможных исходов) или вытягиваен кар-
ту из колоды (52 возножных исхода), то используен:
6«RHD * 1 или 52*RHD * 1
20 PRIHT ■ К'; TAB 8; "l'RHD"; ТАВ20; "6»RHD*1"
30 PRIHT "---TAB 8;*-----'. TAB 20;"-----"
40 RQi ««цикл генерации случайного числа*■
50 FOR к=1 ТО 10
60 LET Ъ-SSD
70 LET С=6»Ь+1
80 RQI ««Обратите внимание на ♦ i»«
90 PRIHT к; TAB 8; b; TAB 20; С
100 HEXT К
110 STOP
RUH
К 1«RHD 6«RHD+1
1 0. 78868103 5. 7320862
2 О 15130615 1.9078369
3 0.34892273 3.0935364
4 0.16993713 2.0196228
5 0. 74623108 5. 4773865
6 0. 96762085 6. 8057251
7 0.57159424 4.4295654
8 0. 87005615 6. 2203369
9 0. 25434875 2. 5260925
10 0.07699585 1.4619751
функция iht.
Вы видите колонку чисел от 1 до 6, но что нам делать с
тем, что содержится после десятичной точки? для того, чтобы
избавиться от этго "мусора" мы можем применить функцию IHT.
ГНТ(а) - дает целую часть числа х. Дробная часть отрезается и
отбрасывается (не округляется).
IHTI5. 6) = 5
1НТ(3. 9) = 3
1НТ(-3. 2) =-4
IHT12)=2
Ножно сказать, что IHT всегда выполняет "округление вниз".
Чему равны значения?
(а) INT(4. 5)
(С) 1НТ(-2. 5)
(е) INTU.01)
(Ь) IHT (9. 1)
(d) INT(-0. 99)
Теперь с помошью Функций INT мы можем генерировать после-
довательность целых чисел от 1 до 6 или от 1 до 52:
IHT (6«RHD+1> или IHT (52«RHD*1)
Нижеприведенная программа продемонстрирует этот эффект:
ю REM »«Функция INT»«
20 PRIHT " К"; TAB 5; "1«RHD";TAB12; "1НТ(б«---"; TAB 22;
"IHT(52«---"
30 PRINT TAB 12; "---RHD*1)"; TAB 22; "---RND*1)"
40 PRINT "---"; TAB 5; "-----"; TAB 12;"---------"; TAB 22;
50 PRINT
70 FOR K=1 TO 10
80 LET b=RND
90 LET C-INT (6»b*l)
100 |
LET i |
d=IHT (52»b+1) |
|
|
no |
PRIHT K: TAB 4;b;TAB |
18: c:tab |
25; d |
120 |
hext |
к |
|
|
130 |
STOP |
|
|
|
RUH |
|
|
|
|
к |
|
rnd«1 IHT(6»--- |
IHT(52 |
|
|
--- |
rhd+1) |
---RHD |
1 |
|
0. 48942566 |
3 |
26 |
2 |
|
0. 70750427 |
5 |
37 |
3 |
|
0. 063140869 |
1 |
4 |
4 |
|
0. 7366333 |
5 |
39 |
5 |
|
0. 24778748 |
2 |
13 |
6 |
|
0. 58491516 |
4 |
31 |
7 |
|
0. 86911011 |
6 |
46 |
8 |
|
0. 18339539 |
2 |
10 |
9 |
|
0. 75558472 |
5 |
40 |
10 |
|
0. 66912842 |
5 |
35 |
6. 3 Postscriptum на тему RKD.
следующая программа инитирует бросание игровой кости юо
раз.
10 REM »»юо бросков кости»»
20 rem ««цикл по J образует серию из 10 бросков»»
30 rem ««цикл по К создает 10 серий»»
40 for К=1 то 10
50 for J=1 то 10
60 let x=iht <6»rhd+1>
70 priht x; "
80 HEXT J
90 priht
100 priht
110 НЕХТ К
120 stop
ruh
А теперь, чтобы убедиться, что Вы хорошо повяли работу
♦ункшш IHT. ответьте на следующую пару вопросов:
ВСК-б. 3 Программа:
20 FOR Х=-3. 8 ТО -1.8 STEP .2
30 LET 7-IHT X
40 PRIHT x, у
50 НЕХТ X
60 STOP
распечатает 10 пар чисел. Что это за числа?
Программа:
20 FOR Х= 1. 6 ТО 3. 4 STEP . 2
30 LET У= IHT X
40 PRIHT X. У
50 НЕХТ X
60 STOP
распечатает девять пар чисел, что это за числа?
вск-б. 4
6. 4 Два примера.
В этом разделе мы рассмотрели два довольно обширных приме-
ра. Они даны с решениями, но было бы все же лучше, если бы Вы
рассматривали эти примеры, как упржнения и попробовали бы ре-
шить их самостоятельно, а результаты решения сравнить.
ПРИНЕР-6. 1 Напишите программу, которая бы имитировала броса-
ние монеты 100 раз. Подсчитайте и распечатайте,
сколько всего раз монета легла "орлом", и сколько "решкой".
В основе решения лежит генератор случайных чисел 1 и
2. пусть "1" представляет "орел", а "2" - "решку".
Тогда алгоритм в описательном виде выглядит так:
1. начало.
2. Установить счетчики "орлов" и "решек" в О.
3. Инициализация учетчика цикла.
4. Генерация случайного числа 1 или 2.
5. Если получено число 2. то переход на 8, иначе - на 6.
6. Добавим 1 к счетчику "орлов".
7. Переход на 9.
8. Добавим 1 к счетчику "решек".
9. Прирашение счетчика цикла.
10. Если счетчик цикла <=100, то переход на п. 4. иначе -
на 11.
11. Печать счетчиков "орлов" и "решек".
12. STOP
И, наконец, сана программа:
20 PRIHT "Результаты 100 бросаний монеты"
30 PRIHT
40 LET h=0
50 REH ««счетчик "орлов"««
60 LET t=0
70 REH ««счетчик "решек"««
80 LET К=1
100 LET у-IHT (2«RHD*1)
110 IF у=2 THEN GO TO 160
130 LET t=t+l
140 REM ««если не "орел", значит "решка"««
150 GO ТО 180
160 REM ««увеличиваем счетчик "орлов"»»
по этому алгоритму подготовим блок-схему:
170 LET h=h+l
180 REH ««увеличиваем счетчик бросаний»«
190 LET K=K+1
200 REH ««повторяем процесс 100 раз««
210 IF К<=100 THEH GO ТО 90
220 PRIHT "ОРЛЫ";"РЕШКИ"
230 PRIHT h.t
240 STOP
Теперь мы организуем счетчики:
t2 - для двоек (орлов);
ml - для четверок (решки);
Ь2 - тройки (смешанный исход).
Исход |
Результат |
00
ОР или РО РР |
1 + 1 = 2
1+2 =2+1=3 2+2 = 4 |
Написать программу, имитирующую 100 бросаний двух
монет. Подсчитать и распечатать результаты выпаде-
ния комбинаций "00", "РР" и "ОР" или "То".
ПРИНЕР-6. 2
применим ту *е счетную систему. "1° - "орел", "2" -
"решка". Но теперь у нас две монеты. Результат первой
сохраним в cl, а результат второй - в с2. Суммарный результат S
может быть равен 2. 3 или 4.
Решение
20 PRIHT "Результаты 100 бросаний 2-х монет:"
30 PRIHT
40 LET h2=0
50 REH ««счетчик 00 ««
60 LET t2=0
70 REH ««счетчик PP««
80 LET ml=0
90 REH ««счетчик op или p0««
95 REH ««Начало главного цикла»»
100 FOR К=1 ТО 100
110 LET c1=IHT (2«RHD+1)
120 REH ««первая монета»«
130 LET ?2=IHT (2«RHD+1)
140 reh ««вторая нонета»»
150 LET S=C1+C1
160 REH ««суммарный итог»»
170 IF S=4 THEH GO TO 280
180 REH ««6P0C0K PP««
190 IF 3=2 THEH GO TO 240
200 REH ««6P0C0K 00««
210 LET mi=mi*i
220 REH »»6P0C0K OP/PO*«
230 GO TO 300
240 REH ««прирашение счетчика 00««
250 LET h2=h2+l
270 GO TO 300
280 REH ««прирашение счетчика РР«»
290 LET t2=t2+l
300 REH »«конец цикла««
310 HEXT К
320 REH »»печать результата»»
330 PRIHT "00".TAB iO;"PO";TAB 20; "PP"
340 PRIHT h2; TAB 10; ml; TAB 20; t2
350 STOP
6. 6 Слияние стрингов.
Затратив массу сил в Уроке 5 на разделение стрингов, мы
теперь уделим немного времени вопросу их слияния. Программа
покажет вам. как это происходит:
10 REM ««слияние»»
20 IHPUT "Первый стринг"; at
30 PRIHT а*
40 ihput "Второй стринг"; ь*
50 priht ь*
60 priht а*+Ь«
70 stop
RUH
микро
компьютер
микрокомпьютер
В английском языке для того, чтбы из существительного
единствиного числа образовать множественное, в боль-
шинстве случаев достаточно добавить к нему окончание -з.
program - programs
byte - bytes
computer - computers
Напишите программу, которая будет принимать от пользовате-
ля существительное в единственном числе, а выдавать его - во
множественном (на английском языке).
Следушая программа демонстрирует возможность слияния стри-
нгов для создания стрингов из символов. Ны накапливаем стринг в
переменной а*, а в цикле 70... 100 добавляем на каждом проходе к
нему новую букву.
Программа б. 1
20 REM ««создание директория»«
30 LET a*="abcdefghiJ"
40 REH ««м»»»»*»"»»»»»»*»*»**»
50 LET с*:""
60 REH »«с* - пустой стринг»«
70 FOR J=1 ТО 10
80 LET c*=c*+a*(J)
90 PRIHT j. с»
100 HEXT J
110 STOP
BCK-6. 5
б. 7 Функция str*
эта Функция имеет действие, противопложное функции VAL.
Если VAL дает нан числовое содержание стринга, то Функция STR*
наоборот, трансформирует число в набор символов. Кажется, что
Функция str* п дает нам само число п. но это не совсем так. Во
втором случае это стринг.
10 reh ««функция str*»»
20 ihput "Введите число";п
30 priht п
40 priht "012345678901234567890"
50 priht п. str* п
60 stop
ruh
17
012345678901234567890
17 17
ruh
-17
012345678901234567890
-17 -17
ruh
99. 34
012345678901234567890
99. 34 99. 34
ruh
-99. 34
012345678901234567890
-99. 34 -99. 34
в следующей программе мы используем тот Факт, что STR* 8
это стринг "8", а не число 8. Благодаря этому мы сможем "при-
крепить" его к символьной последовательности, чего нельзя было
сделать с числом.
20 let с»=""
зо rem ««с*- пустой стринг»«
40 for j = 1 to 10
50 let c*-c*+srt* j
60 priht j. c*
70 next j
80 stop
УПРАЖНЕНИЕ-6. 1 Напишите программу, которая примет с клавиату-
ры слово, перекодирует каждую букву в число
(по порядковому номеру буквы в алфавите), а затем выдаст это
слово в закодированном виде.
ПРИМЕЧАНИЕ: воспользуйтесь программой 6. 1 (но для всего
алфавита), чтобы поставить каждой букве в соответствие число в
едином списке. Не забудьте про оператор DIM. По одной просмо-
трите все буквы введенного слова и сравните их со списком. Ког-
да буква в списке найдена, возьмите ее индекс (номер позиции),
переведите его в стринговую Форму и "подшейте" к результату.
УПРАЖНЕНИЕ-6.2 Напишите программу, которая сгенерирует 20
случайных трехбуквенных слов. Интересно посмо-
треть, сколько раз придется запустить эту програнну, прежде,
чем она создаст реально существующее слово.
Задание на самостоятельную проработку.
1. Напишите фрагмент игровой программы. Ван сдаются неско-
лько (сколько - выберите сани) карт из колоды. Что у Вас на
руке после сдачи?
Примечание:
1) Воспользуйтесь английской нотацией для обозначения мас-
тей:
S - Spades - "пики"
С - clubs - "трефы"
В - Diamonds- "бубны"
Н - Hearts - "черви"
2) Воспользуйтесь английской нотацией для обозначения
достоинства карт:
А - Асе - Туз
К - Kine - Король
q - Queen - дама
J - JacK - Валет
T - Ten - десятка
9. . . 2 - 9. . . 2
Таким образом, обозначение любой карты складывается из
двух символов, например.
AD - ТУЗ бубновый
тн - десятка червей
JS - валет пик.
3) Не забудьте, что каждая карта не может быть сдана дваж-
ды.
Подсказка:
1) Сначала создайте список-колоду. Это нужно сделать так
же, как в упражнениях 1 и 2 мы это делали с алфавитом.
2) "Сдавайте" карты из колоды, используя генератор случай-
ный чисел от 1 до 52. Считая, что случайное число - это номер
карты в колоде, выберите эту карту из подготовленного списка.
3) Карт в колоде - 52, но символов в Вашем списке должно
быть 104, т. к. каждая карта обозначается двумя символами.
4) Перед выборон карты из колоды следует случайное число
умножить на 2, т. к. на каждую карту ушло две позиции в списке.
5) выбрав карту из колоды (списка), на ее место нужно по-
ставить метку (например, "«»"), чтобы не пришлось второй раз
выбрать эту же карту.
ОБЗОР УРОКА
закончив урок, проверьте свои знания и навыки по следующим
вопросам:
- использование RKD для генерации случайных чисел от О до 1;
- использование 1ST и RHD для генерации случайных целых чисел
от о до п;
- имитация бросания монеты;
- имитация бросания двух монет;
- имитация бросания кости;
- митапия бросания двух костей;
- слияние стрингов;
- использование функции STR»(x).
ОТВЕТЫ НА ВОПРОСЫ ДЛЯ САМОКОНТРОЛЯ
10 FOR К=1 ТО б
20 LET n=6«RHD
30 PRIHT П
40 НЕХТ К
50 STOP
ЕЕЭ
|вск-б. г|
1ВСЖ-6. 31
(а) 4 (b) 9 (С) -3
(d) -1 (е) 1
RUH
-3. 8 -4
-3. 6 -4
-3. 4 -4
-3. 2 -4
-3. -3
-г. в -з
-г. б -з
-2.4 -з
-г. г -з
-г. -г
RUH
1. б 1
1. 8 1
г. г
г. г г
г. 4 г
г. б г
г. 8 г
з. з
з. г з
20 LET a»="s"
30 IHPUT "введите слово'; Ь*
40 PRIHT b*
50 PRIHT М+а*
60 STOP
RUH
tree
trees
RUH
house
houses
ОТВЕТЫ К УПРАЖНЕНИЯМ
УПРАЖНЕНИЕ-6. 1
10 REH »»Простейшая кодирующая программа»»
20 PRIHT "Генератор кода"
30 LET С*-"
40 DIH а* (32)
50 LET а«="абвгдежзийклннопрстуфхцчшпшьэъюя"
60 REM »«Создали директорий»»
70 IHPUT "Введите слово" ;w»
80 PRIHT Vt
90 LET K=LEH W»
100 REH ««Просмотр директория»«
110 FOR J=1 TO К
120 LET f=l
125 REH »»пикл сравнения»»
130 IF W»(J)=a»(f) THEH GO TO 160
140 REH »«Выход, когда пара найдена»»
150 LET К=К+1
155 GO ТО 125
160 REH ««Номер найденного символа становится кодом»»
170 LET c*=c»+STR* К
180 HEXT j
190 PRIHT
200 PRIHT С*
210 STOP
УПРАЯНЕНИЕ-6. 2
10 reh ««случайные слова»«
20 priht "Програнна генерации случайных слов"
30 reh »«директорий»«
40 let а»="абвгдежзийклмнопрстуфхцчтшыьэыоя"
50 ihput "Еше список? у/п?";г*
60 if г»<>"у" theh go то 210
70 reh ««20 слов»»
80 for к=1 то 20
90 reh ««Начинаем с пустого стринга»»
100 let w»=""
110 reh ««Генерация слова»»
120 for j--1 то 3
130 let x=iht <32»rhdm)
140 let w*=w*+a»(x)
150 hext J
160 reh »«Печать слова»»
170 priht w*
9 - 6613
180 REH ««Возврат за новт словом»»
190 НЕХТ К
200 GO ТО 50
210 STOP