Случайные числа Зачем вообще нужны случайные числа? Вы наверняка играли в лучшие игры 95 года, такие как "Сапёр", "Пасьянсы" и т.д. Так вот, как вы могли заметить, что мины в "Сапёре" каждый раз находяться в разных местах. Карты в "Пасьянсах" каждый раз раскладываются по иному. Иначе, ведь было бы не совсем не интересно обезвреживать минное поле, когда знаешь где лежит мина. Вот здесь и используются случайные числа! Хотя, конечно, абсолютного случайного числа не существует :). Все они псевдослучайные, т.е. всё равно их генерация выполняется по определённому алгоритму. Для того, чтобы в Visual Basic сгенерировать случайное число необходимо использовать функцию Rnd. Эта функция возвращает случайное значение в пределах [0,1). Например, поместите на форму кнопку и вставьте такой код: Private
Sub
Command1_Click() При нажатии на кнопку на форме появятся числа: 0.7055475 Что, у вас точно такие же числа??? Так какие же они тогда случайные? Всё дело в том, что мы не инициализировали начальный источник (initial seed). Делается это оператором Randomize. Этот оператор имеет один необязательный параметр - число, начальный seed. Если параметр не задавать, то VB инициализирует начальный seed по текущему таймеру системы. Итак, вставим оператор Randomize перед использованием функции Rnd и получим: Randomize на форме: 0.2929193 Причём теперь, при каждом запуске программы числа будут разные и никогда не повторятся. Что изменится, если вызвать оператор Randomize с параметром? Посмотрим. Вставим вместо Randomize, к примеру, Randomize 100: Randomize 100 Запустим программу и увидим: 0,6506922 Как видите числа у нас с вами опять получились одинаковые. Т.е. при каждом запуске программы, числа будут генерироваться с одинаковой последовательностью. Нажмите 2 раза на кнопку. На форме появятся 6 чисел. Но они все разные? У меня вышло: 0,6506922 0,742779 ...... Почему так происходит? Ведь в начале кода стоит Randomize 100, и вроде как он должен срабатывать каждый раз при нажатии на кнопку?... Нет. Randomize 100 работает только один раз. Далее числа генерируются разные, но именно по последовательности 100, а не какой-либо другой. Естесственно вместо 100 вы можете указать любое другое число. Иногда это может быть полезно. Если вам понядобится повторить нужную последовательность сначала, то необходимо вызвать функцию Rnd c отрицательным параметром. Например, следующий код, при каждом нажатии на кнопку выдаёт одно и то же: Form1.Print
Rnd(-1) Часто возникает необходимоть сгенерировать случайное число в диапазоне [0,X], а не только [0,1). Как это сделать? Очень просто. Достаточно округлить произведение Rnd*X: Form1.Print Int(Rnd * 100) Этот код генерирует случайное число в диапазоне от 0 до 99. Почему до 99? Заглянем в документацию... Ага, вот, функция Int - отбрасывает дробную часть от вещественного числа. Т.к. Rnd возвращает число в пределах [0,1) (т.е. единицы быть не может), то максимальное число - 99.99999... Таким образом, чтобы получить случайное число в диапазоне [0,100], нужно умножить Rnd на 101. Теперь всё должно быть ясно. Чтобы сгенерироваить число в диапазоне не [0,X], а [X,Y], можно использовать такую формулу: Form1.Print Int((Y - X + 1) * Rnd + X) Например, сгенерируем число в диапазоне от 5 до 10: Form1.Print Int((10 - 5 + 1) * Rnd + 5) Или проще: Form1.Print Int(Rnd * 6) + 5 Здесь Int(Rnd * 6) генерирует число в пределах [0,5]. Прибавив к этому числу 5, мы получим наш искомый диапазон - [5,10]. Ну вот и всё, надеюсь, теперь все проблемы, связанные с использованием случайных чисел в Visual Basic должны исчезнуть. Кстати, для тех кто заинтересуется, я написал класс, который позволяет генерировать случайные числа из определённого диапазона без повторений. К классу прилагается пример - генератор билетов игры "Русское Лото". Скачать класс можно здесь. Автор - Волков Антон. (по заказу - ). | ||||||||||||||||||||||||||||||||||||||||||||