Методы: более глубокий взгляд

Рейтинг: 4.6 из 5
Автор
Вадим Соколов
Рейтинг автора
4.6

В этом и следующем разделах мы разрабатываем хорошо структурированное игровое приложение с несколькими методами. Приложение использует большинство операторов управления, представленных до сих пор в книге, и вводит несколько новых концепций программирования.

В воздухе казино есть что-то, что воодушевляет людей - от хайроллеров за плюшевыми столами из красного дерева и войлочного крэпса до четвертных попперов у одноруких бандитов. Этоэлемент случайности, возможность того, что удача превратит полный карман денег в гору богатства. Элемент случайности может быть введен в приложение через объект класса Random (пространства имен System ). Объекты классаRandomмогут создавать случайные байтовые , целые и двойные значения. В следующих нескольких примерах мы используем объекты класса Random для создания случайных чисел.

Безопасные случайные числа

Согласно документации Microsoft для класса Random , генерируемые им случайные значения «не являются полностью случайными, потому что для их выбора используется математический алгоритм, но они достаточно случайны для практических целей». Такие значения не следует использовать, например, для создания случайно выбранных паролей. Если вашему приложению требуются так называемые криптографически безопасные случайные числа, используйте класс RNGCryptoServiceProvider 1 из пространства имен System.Security.Cryptography ) для создания случайных значений:

7.8.1 Создание объектаслучайноготипа

Новый объект генератора случайных чисел может быть создан с помощью класса Random (из пространства имен System ) следующим образом:

Затем объект Random можно использовать для генерации случайных значений типа byte , int и double - здесь мы обсуждаем только случайные значения типа int .

7.8.2 Генерация случайного целого числа

Рассмотрим следующее утверждение:

При вызове без аргументов методNextкласса Random генерирует случайное значение типа int в диапазоне от 0 до +2 147 483 646 включительно. Если метод Next действительно производит значения случайным образом, то каждое значение в этом диапазоне должно иметь равный шанс (или вероятность) быть выбранным при каждом вызове метода Next . Значения, возвращаемые Next , на самом деле являютсяпсевдослучайными числами- последовательностью значений, полученной в результате сложного математического вычисления. В расчетах используется текущее время дня (которое, конечно, постоянно меняется) дляпосева.генератор случайных чисел, так что каждое выполнение приложения дает различную последовательность случайных значений.

7.8.3 Масштабирование диапазона случайных чисел

Диапазон значений, создаваемых непосредственно методом Next, часто отличается от диапазона значений, необходимого в конкретном приложении C #. Например, приложение, которое имитирует подбрасывание монеты, может потребовать только 0 для «орла» и 1 для «решки». Приложение, которое имитирует качение шестигранной кости, может потребовать случайные целые числа в диапазоне 1–6. Видеоигра, которая случайным образом предсказывает следующий тип космического корабля (из четырех возможных), который будет пролетать через горизонт, может потребовать случайных целых чисел в диапазоне 1–4. Для подобных случаев класс Random предоставляет версии метода Next, которые принимают аргументы. Один получает аргумент типа int и возвращает значение от 0 до значения аргумента, но не включая его. Например, вы можете использовать оператор

который возвращает 0, 1, 2, 3, 4 или 5. Аргумент 6, называемыйкоэффициентом масштабирования,представляет количество уникальных значений, которые должен произвести Next (в данном случае шесть - 0, 1, 2, 3, 4 и 5). Эта манипуляция называетсямасштабированиемдиапазона значений , полученных с помощью случайного метода Next .

7.8.4 Сдвиг диапазона случайных чисел

Предположим, мы хотим смоделировать шестигранный кубик, на гранях которого цифры 1–6, а не 0–5. Одного масштабирования диапазона значений недостаточно. Таким образом, мысдвигаемдиапазон производимых чисел. Мы могли бы сделать это, добавивзначение сдвига- в данном случае 1 - к результату метода Next , как в

Значение сдвига ( 1 ) указывает первое значение в желаемом наборе случайных целых чисел. Предыдущий оператор присваивает лицу случайное целое число в диапазоне 1–6.

7.8.5 Комбинирование сдвига и масштабирования

Третья альтернатива метода Next обеспечивает более интуитивный способ выражения сдвига и масштабирования. Этот метод получает два аргумента типа int и возвращает значение от значения первого аргумента до значения второго аргумента, но не включая его. Мы могли бы использовать этот метод для написания оператора, эквивалентного нашему предыдущему оператору, как в

7.8.6 Прокатка шестигранной матрицы

Чтобы продемонстрировать случайные числа, давайте разработаем приложение, которое имитирует 20 бросков шестигранной кости и отображает значение каждого броска. На рис. 7.5 показаны два примера выходных данных, которые подтверждают, что результаты предыдущих вычислений являются целыми числами в диапазоне 1–6 и что каждый запуск приложения может создавать различную последовательность случайных чисел. Строка 9 создает случайный объект randomNumbers для получения случайных значений. Строка 15 выполняется 20 раз в цикле для броска кубика, а в строке 16 отображается значение каждого броска.

Рис. 7.5| Сдвинутые и масштабированные случайные целые числа.

Прокатывание шестигранной кости 60 000 000 раз

Чтобы показать, что числа, полученные с помощью Next, происходят с примерно равной вероятностью, давайте смоделируем 60 000 000 бросков кубика (рис. 7.6). Каждое целое число от 1 до 6 должно встречаться примерно 10 000 000 раз.

Рис. 7.6| Бросьте шестигранный кубик 60 000 000 раз.

Как показывают два примера выходных данных, значения, полученные с помощью метода Next, позволяют приложению реалистично моделировать прокатку шестигранной матрицы. Приложение использует вложенные операторы управления ( переключатель вложен внутри for ), чтобы определить, сколько раз возникала каждая сторона кристалла. Оператор for (строки 19–45) повторяется 60 000 000 раз. Во время каждой итерации строка 21 производит случайное значение от 1 до 6. Это номинальное значение затем используется как выражение переключения (строка 24). На основе номинальной стоимости, то переключательоператор увеличивает одну из шести переменных счетчика на каждой итерации цикла. (В Разделе 8.4.7 мы показываем элегантный способ замены всего оператора switch в этом приложении одним оператором.) Оператор switch не имеет метки по умолчанию, потому что у нас есть метка case для каждого возможного значения die, которое выражение в строке 21 может производить. Запустите приложение несколько раз и посмотрите на результат. Вы увидите, что каждый раз, когда вы запускаете этот apkp, он дает разные результаты.

7.8.7 Масштабирование и сдвиг случайных чисел

Ранее мы продемонстрировали утверждение

который имитирует качение шестигранной матрицы. Этот оператор всегда присваивает переменной face целое число в диапазоне 1 ≤ face< 7 . Ширина этого диапазона (т. Е. Количество последовательных целых чисел в диапазоне) равна 6 , а начальное число в диапазоне - 1 . Ссылаясь на предыдущий оператор, мы видим, что ширина диапазона определяется разницей между двумя целыми числами, переданными в метод Random Next , а начальным номером диапазона является значение первого аргумента. Мы можем обобщить этот результат как

где shiftValue указывает первое число в желаемом диапазоне последовательных целых чисел, а scalingFactor указывает, сколько чисел находится в диапазоне.

Также можно выбирать целые числа случайным образом из наборов значений, отличных от диапазонов последовательных целых чисел. Для этого проще использовать версию метода Next, которая принимает только один аргумент. Например, чтобы получить случайное значение из последовательности 2, 5, 8, 11 и 14, вы можете использовать оператор

В этом случае randomNumbers.Next (5) возвращает значения в диапазоне 0–4. Каждое полученное значение умножается на 3, чтобы получить число в последовательности 0, 3, 6, 9 и 12. Затем мы добавляем 2 к этому значению, чтобы сместить диапазон значений и получить значение из последовательности 2, 5, 8, 11 и 14. Мы можем обобщить этот результат как

где shiftValue указывает первое число в желаемом диапазоне значений, разница-BetweenValues представляет разницу между последовательными числами в последовательности, а scalingFactor указывает, сколько чисел находится в диапазоне.

7.8.8 Повторяемость для тестирования и отладки

Как мы упоминали ранее в этом разделе, методы класса Random фактически генерируют псевдослучайные числа на основе сложных математических вычислений. Неоднократный вызов любого из методов Random дает последовательность чисел, которая кажется случайной. При вычислении псевдослучайных чисел время дня используется в качественачального значениядля изменения начальной точки последовательности. Каждый новый объект Random заполняет себя значением, основанным на часах компьютерной системы в момент создания объекта, что позволяет каждому выполнению приложения производить различную последовательность случайных чисел.

При отладке приложения иногда полезно повторять одну и ту же последовательность псевдослучайных чисел во время каждого выполнения приложения. Эта повторяемость позволяет вам доказать, что ваше приложение работает с определенной последовательностью случайных чисел, прежде чем тестировать приложение с различными последовательностями случайных чисел. Когда важна повторяемость, вы можете создать случайный объект следующим образом:

SeedValue аргумент (ые INT ) семена расчета- с использованием случайных чисел в том же seedValue каждый раз , когда производит такое же последовательность случайных чисел. Разумеется, разные начальные значения производят разные последовательности случайных чисел.

Новости спорта

Изначально сайт создавался для пользователей со всех стран мира. Международный домен ориентирован на самых разных пользователей. Страницы сайта переведены на 46 языков, среди которых есть и азербайджанский. Это выгодно выделяет платформу на фоне конкурентов, так как многие из них либо не работают на территории данной страны, либо не имеют местной локализации.

Больше новостей