Как сгенерировать случайное число в Java | Программирование на Java, Android

Генератор случайных чисел — java.util.Random

2006-10-14 Java

Как говорится: случайность — частный случай закономерности.

Поэтому наверняка вы используете случайные числа в некоторых своих разработках.

В Java есть класс для работы со случайными (точнее псевдослучайными) числами — java.util.Random. Тем не менее, некоторые люди пользуются им не совсем так, как надо.

Пример:

public class TestRandom { private static Random random = new Random(); static int generateRandom(int n) { return Math.abs(random.nextInt()) % n; } }

Казалось бы, что тут такого плохого?

Давайте рассмотрим следующий метод (можете поместить его в класс TestRandom):

static void test1() { int n = (Integer.MAX_VALUE / 3) * 2; int bottom = 0; for (int i=0; i static void test2() { int n = Math.abs(Integer.MIN_VALUE) % 4; System.out.println(n); n = Math.abs(Integer.MIN_VALUE) % 14; System.out.println(n); }

А выход есть — используйте Random.nextInt(int), не зря же его дядьки умные придумали.

Updated (28.01.2008): В литературе мне встречалась информация, что если n — степень двойки, то последовательность псевдослучайных чисел будет повторятся через довольно короткий период. Как я и обещал ранее, привожу небольшой тест, который подтверждет это утверждение:

public class Randomizer { public static final int INITIAL_LENGTH = 1000000; public static final int POWER_OF_TWO = 2; private static class Sequence { private int index = 0, count = 0; public Sequence(int index) { this.index = index; } public int getIndex() { return index; } public void increase() { count++; } public int getCount() { return count; } void reset() { count = 0; } void setIndex(int index) { this.index = index; } } private static class SequencesPool { private List

Программа для POWER_OF_TWO = 2 дает следующий результат:

131071; 262143; 393215; 524287; 655359; 786431; 917503; 999999;

То есть с периодом 131072 последовательность чисел повторяется. Для POWER_OF_TWO = 4 мощности моего компьютера не хватает. Попробую как-нибудь на машине посерьезнее…

Надеюсь, статья была вам интересна. До скорой встречи.

Прежде чем познакомиться с методами узнаем, как мы можем создавать случайные числа.

Эти знания пригодятся нам в приложении, чтобы генерировать случайные вопросы, а не заранее определённые.

Вся сложная работа уже проделана за нас (да здравствует Java!) в классе Random. Для начала нам нужно создать объект класса Random:

Random randInt = new Random();

После, мы используем метод nextInt() нашего нового объекта для генерации случайного числа в определённом диапазоне:

int ourRandomNumber = randInt.nextInt(10);

 

Диапазон ожидаемого нами числа начинается с 0 и заканчивается 9. Если же мы хотим получить случайные числа в диапазоне от 1 до 10, после вычисления метода nextInt() придётся добавить единицу:

ourRandomNumber++;

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

JavaRandom

Класс Random

Класс java.util.Random представляет собой генератор псевдослучайных чисел.

Класс представлен двумя конструкторами

  • Random() — создаёт генератор чисел, использующий уникальное начальное число
  • Random(long seed) — позволяет указать начальное число вручную

Так как класс создаёт псевдослучайное число, то задав начальное число, вы определяете начальную точку случайной последовательности. И будете получать одинаковые случайные последовательности. Чтобы избежать такого совпадения, обычно используют второй конструктор с использованием текущего времени в качестве инициирующего значения.

Методы:

  • boolean nextBoolean() — возвращает следующее случайное значение типа boolean
  • void nextBytes(byte[] buf) — заполняет массив случайно созданными значениями
  • double nextDouble() — возвращает следующее случайное значение типа double
  • float nextFloat() — возвращает следующее случайное значение типа float
  • synchronized double nextGaussian() — возвращает следующее случайное значение гауссова случайного числа, т.е. значения, центрированное по 0.0 со стандартным отклонением в 1.0 (кривая нормального распределения)
  • int nextInt(int n) — возвращает следующее случайное значение типа int в диапазоне от 0 до n
  • int nextInt() — возвращает следующее случайное значение типа int
  • long nextLong() — возвращает следующее случайное значение типа long
  • synchronized void setSeeD(long seed) — устанавливает начальное значение

Пример для вывода случайного числа.

Случайные числа часто используются в играх. Допустим, мы хотим вывести случайные числа от 1 до 6 при бросании игрального кубика. Попробуем.

При проверке вы заметите две нестыковки. Во-первых, иногда выпадает число 0, которого нет на кубике, а во-вторых никогда не выпадает число 6. Когда вы помещаете число в параметр метода, то это означает, что выпадают числа в диапазоне от 0 до указанного числа, которое в этот диапазон не входит. Если вы будете использовать число 7, то шестёрка станет выпадать, но по-прежнему будет выпадать число 0. Поэтому пример следует немного отредактировать.

Для генерации 10 чисел типа int используйте код:

Работать с числами не слишком интересно. Давайте поработаем со цветом.

В Android некоторые цвета имеют конкретные названия, но по сути они являются числами типа int, например, красный цвет имеет константу Color.RED. Вам не надо знать, какое число соответствует этому цвету, так как проще понять по его названию.

Щёлкая по кнопке, вы будете менять её цвет случайным образом.

Лотерея «6 из 49»

Сформируем шесть случайных чисел из 49 и занесём их в списочный массив.

SecureRandom

Стандартный класс Random обычно используют для простых задач, не связанных с шифрованием. Для криптографии следует использовать схожий класс java.security.SecureRandom.

Не забывайте, что в классе Math есть метод random(), возвращающий случайное число от 0 до 1 (единица в диапазон не входит).

Реклама

Статья проплачена кошками — всемирно известными производителями котят.

Если статья вам понравилась, то можете поддержать проект.

.

Добавить комментарий

Закрыть меню