Псевдослучайные числа Одномерный массив и его обработка
Мы часто сталкиваемся в жизни со случайными событиями. Но это нам только кажется. На самом деле случайных событий не бывает, так как любому следствию обязательно предшествует причина. В том случае, когда причинно-следственные связи многочисленны, человек не может предсказать или вычислить конечное событие, поэтому такое событие он называет случайным. Например, заранее не назначенная встреча двух людей в многомиллионном городе представляется им обоим удивительно случайной. Программы пишутся для людей, и поэтому зачастую в них требуется появление случайных чисел. Для этой цели в языках программирования их создатели устраивают генераторы для появления случайных чисел. Мы уже с вами договорились, ничего случайного не может быть, поэтому и такие числа правильнее будет называть псевдослучайными – как бы случайными. Псевдослучайные числа необходимы, например, для игровых, тестирующих и так далее, программ. Генератор псевдослучайных чисел строят, например, так: берется определенное число, затем над ним выполняется конечное число определенных математических действий, в результате получается первое псевдослучайное число. Над этим числом проводится та же последовательность действий, в результате получается второе псевдослучайное число и так далее. Человек же, не зная этой закономерности последовательности действий, воспринимает появляющиеся числа как случайные. Например, в компьютерной карточной игре на экране появляется карта случайного старшинства и к тому же случайной масти. В Visual Basic программа-генератор псевдослучайных чисел реализуется функцией Rnd. Эта функция генерирует десятичные дробные числа в диапазоне больше либо равно нулю, но меньше единицы. Познакомимся с этим оператором поближе. Запустите Visual Basic. На форме Form1 разместите электронную кнопку Command1. Для написания программного кода кликните по вновь созданной кнопке два раза. В появившейся процедуре Command1_Click впишите утверждение:
Print Rnd
Несколько раз кликните по электронной кнопке, проследите за случайными числами, появляющимися на форме приложения. Закройте приложение и вновь запустите его. Заметьте, что числа в точности повторяются, причем в той же последовательности. Это говорит о том, что здесь работает определенная закономерность, а следовательно выбрасываемые числа правильнее называть псевдослучайными. Для того чтобы избежать досадной повторяемости последовательности псевдослучайных чисел используется специальная инструкция Randomize (Перемешивание), которая в качестве первого случайного числа берет текущее время. Слегка усложним программный код:
Randomize Print Rnd
Проверьте, как теперь работает программа, запустив ее несколько раз. Вы обнаружите, что после повторного запуска программы последовательности случайных чисел будут различными. Теперь непредсказуемость случайного числа еще больше усилится. Как быть, если в программе требуются целые случайные числа? Для начала умножим выпавшее случайное десятичное число, имеющее только дробную часть, как минимум на десять:
Randomize Print Rnd * 10
Заметьте, что случайные числа теперь обзавелись целой частью, которая колеблется в пределах от 0 до 9. Математическая функция Fix позволяет отбрасывать от числа его дробную часть:
Randomize Print Fix (Rnd * 10)
Проверьте, как теперь работает программный код, запустив программу на выполнение несколько раз. И так, мы получили случайные целые числа в диапазоне от 0 до 9. Попробуйте умножить Rnd на 100, затем на 1000. Получим диапазоны от 0 до 99, от 0 до 999. Для того чтобы не кликать по электронной кнопке каждый раз, когда мы хотим получить случайное число, используем знакомую уже Вам циклическую конструкцию:
Randomize Cls ‘ очистка экрана
For i=0 To 29 ‘ начало цикла Print Fix (Rnd * 10) ’ тело цикла выводит на экран случайные числа Next i ‘ конец цикла
Теперь при одиночном клике по электронной кнопке на экране появится 30 случайных чисел. Ясно, что вторая строка в программе необязательна. Как правило в программе требуется чтобы выпавшая последовательность запоминалась для дальнейшего использования. Для этого последовательность необходимо поместить в одномерный массив с помощью оператора Dim. Массив – это структурированный бокс для хранения множества элементов данных одинакового типа. Массивы могут быть одномерными и многомерными. С двумерными массивами мы познакомимся в следующем уроке. Любой элемент массива задается именем массива и индексом, заключенным в круглые скобки, например: a (1), b (4), c (n), d (m). Откройте новый проект. На форме Form1 установите две электронные кнопки – Command1 и Command2. В окне для ввода программного кода для формы Form1 в общем разделе (general) запишите строку объявляющую одномерный массив a:
Dim a (10) ‘ резервирование памяти для одномерного ‘ массива на десять элементов
Обратите внимание, что эти десять элементов будут индексироваться (нумероваться) от 0 до 9. В процедуру Command1_Click впишите первый цикл:
Randomize
For i = 0 To 9 a (i) = Fix (Rnd * 1000) ‘ запись случайных чисел в массив Next i
В процедуру Command2_Click впишите второй цикл:
For i = 0 To 9 Print a (i) ‘ вывод массива на экран Next i
Итак, первая электронная кнопка формирует последовательность случайных чисел и сразу же размещает каждое число на свое место в массиве. Эти места в одномерном массиве обозначаются: a(0); a(1); a(2); … a(9), всего их в данном случае десять. Вторая электронная кнопка берет числа из массива и показывает их на экране. Внимательно протестируйте программу. Займемся обработкой одномерного массива. Допустим, что необходимо вычислить сумму всех элементов массива. Взяв за основу предыдущую программу, сделать это можно, например, внеся изменения в процедуру Command2_Click:
For i = 0 To 9 Print a (i) s = s + a (i) ‘ суммирование всех элементов массива Next i Print s ‘ вывод суммы на экран
Инструкция s = s + a (i) выполняется десять раз, она последовательно добавляет в переменную s все элементы массива, а следовательно находит их сумму. Последняя строка расположилась вне цикла и поэтому команда вывода на экран суммы выполняется только один раз. Проверьте, правильно ли работает программа. Последнюю строку для лучшей выразительности работы программы можно записать так: Print "Сумма = "; s Решим еще одну задачу по обработке одномерного массива. Пусть требуется из массива случайных чисел выбрать числа меньшие чем пятьдесят и показать их на экране. Откройте новый проект. Не забудьте зарезервировать массив. Программный код может быть, например, таким:
Cls Randomize
For i = 0 To 9 a (i) = Fix (Rnd * 100) If a (i) < 50 Then Print a (i) ‘ выбор чисел меньших пятидесяти Next i
Проверьте, правильно ли происходит выборка чисел по заданному условию в работе программы. А теперь рассмотрим одномерные массивы построенные на основе закономерностей и займемся их обработкой. Пусть требуется вывести на экран ряд натуральных чисел от 1 до 25 и вычислить их сумму. Откройте новый проект. На форме установите электронную кнопку. Зарезервируйте массив на 25 чисел в общем разделе (general):
Dim a (1 To 25)
В процедуру Command1_Click впишите программный код:
For i = 1 To 25 a (i) = i Print a (i) s = s + a (i) Next i Print "Сумма = "; s
Проверьте, правильно ли работает программа. Следующая задача по обработке массива будет звучать так: сформировать последовательность из целых нечетных чисел от (–15) до 5, вычислить сумму элементов этой последовательности и подсчитать число ее отрицательных элементов. Можно изменить и доработать предыдущую программу:
Dim a (-15 To 5)
For i = -15 To 5 Step 2 ‘ перебор целых чисел с шагом два a (i) = i Print a (i) If a (i) < 0 Then n = n + 1 ‘ подсчет отрицательных элементов массива s = s + a (i) Next i Print "Сумма = "; s Print "Число отрицательных элементов = "; n
Строка подсчета числа отрицательных элементов одномерного массива читается: если элемент с номером i оказался отрицательным, то переменная n увеличивается на единицу. Остальные строки не являются для Вас принципиально новыми. Протестируйте программу. Решим задачу по отысканию максимального элемента в одномерном массиве. Программа может быть такой:
Dim a(1 To 20), b
Cls Randomize b = 0
For i = 1 To 20 a (i) = Fix (Rnd * 1000) Print a (i) Next i
For i = 1 To 20 If a (i) > b Then b = a (i) Next i
Print "Максимальный элемент ="; b
В программе используется промежуточная переменная b. В самом начале b = 0. Затем идет сравнение очередного элемента с содержимым переменной b. Если оказывается что очередной элемент массива больше переменной b, то значение этой переменной заменяется на значение этого элемента. В противном случае ничего не происходит. Проверьте работоспособность программы.
Домашнее задание
1. Сформируйте одномерный массив состоящий двенадцати случайных трехзначных чисел в диапазоне от 100 от до 999. 2. Сформируйте одномерный массив состоящий двадцати случайных двухзначных чисел в диапазоне от 10 от до 99. Определите сколько раз выпадет число «35». 3. Сформируйте одномерный массив состоящий ста случайных чисел в диапазоне от 0 от до 99. Вычислите сумму тех чисел, которые окажутся больше восьмидесяти. 4. Сформировать последовательность из целых четных чисел от (–42) до 24, вычислить сумму отрицательных элементов этой последовательности и подсчитать число ее положительных элементов. 5. Постройте приложение в котором при клике по электронной кнопке должен выбрасываться туз произвольной масти. 6. Напишите программу отыскивающую минимальный элемент в одномерном массиве случайных целых чисел.
|
Урок восьмой |
Азбука |
Visual Basic |