Чему мы учимся из книг?
Наиболее очевидным и интуитивно понятным способом является генерирование случайных чисел в Java с простым вызовом:
java.lang.math.random ()
На всех других языках генерирование случайных чисел похоже на использование классов математических инструментов, таких как ABS, POW, пол, SQRT и другие математические функции. Большинство людей узнают об этой категории с помощью книг, учебных пособий и курсов. Простой пример: двойное точное число с плавающей запятой может быть сгенерировано от 0,0 до 1,0. Затем, через приведенную выше информацию, разработчик хочет генерировать номер с плавающей запятой с двойной задачей от 0,0 до 10,0 и написать это так:
Math.random () * 10
Если генерируется целое число между 0 и 10, оно будет написано как:
Math.round (Math.random () * 10)
Передовой
Читая исходный код Math.random () или просто используя функцию автоматического завершения IDE, разработчики могут легко обнаружить, что java.lang.math.random () использует внутренний случайно сгенерированный объект - очень мощный объект может быть гибким случайным Поколение: логические значения, все числовые типы и даже гауссовые распределения. Например:
new java.util.random (). Nextint (10)
У него есть недостаток, то есть это объект. Его метод должен быть вызван через экземпляр, что означает, что его конструктор должен быть вызван первым. Если есть достаточная память, выражения, подобные вышеупомянутой, приемлемы;
Простое решение, которое может избежать создания нового экземпляра каждый раз, когда случайное число - это использование статического класса. Возможно, вы подумали о java.lang.math, очень хорошо, мы улучшаем инициализацию java.lang.math. Несмотря на то, что этот проект низкий, вам также необходимо сделать несколько простых модульных тестов, чтобы убедиться, что он не пойдет не так.
Предполагая, что программа должна генерировать случайное число для хранения, проблема появляется снова. Например, иногда необходимо управлять или защищать семена, и внутреннее число используется для хранения состояния и расчета следующего случайного числа. В этих особых случаях неуместно делиться случайно генерируемыми объектами.
одновременный
В среде многопоточного приложения Java EE, случайно сгенерированные объекты экземпляра все еще могут храниться в классе или другом классе реализации в качестве статического свойства. К счастью, java.util.random-это никота, поэтому нет риска, что несколько вызовов темы разрушат семя.
Еще одна вещь, которую стоит рассмотреть, - это многопоточный экземпляр Java.lang.threadlocal. Ленивый подход заключается в реализации одного экземпляра через сам Java API.
Хотя Java не предоставляет хорошего способа управлять одним экземпляром java.util.random. Тем не менее, долгожданный Java 7 обеспечивает новый способ генерации случайных чисел:
java.util.concurrent.threadlocalrandom.current (). Nextint (10)
Этот новый API объединяет преимущества двух других подходов: один экземпляр/статический доступ, такой гибкий, как Math.random (). Threadlocalrandom также быстрее, чем любой другой способ обработки высокой параллелистики.
опыт
Крис Марасти-Георг указывает:
Math.round (Math.random () * 10)
Сделайте распределение несбалансированным, например: 0,0 - 0,499999 будут округлыми до 0, в то время как от 0,5 до 1,499999 будет окружить 1. Итак, как использовать синтаксис старого стиля для достижения правильного сбалансированного распределения следующим образом:
Math.floor (math.random () * 11)
К счастью, если мы используем java.util.random или java.util.concurrent.threadlocalrandom, нам не нужно беспокоиться о вышеперечисленном.
Практический проект Java вносит некоторые вреда неверно с использованием java.util.random API. Этот урок говорит нам не использовать:
Math.abs (rnd.nextint ())%n
И использовать:
rnd.nextint (n)
Вы выше - это связанное введение в n случайных чисел в Java, и я надеюсь, что это будет полезно для каждого обучения.