Освой программирование играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Класс 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) - устанавливает начальное значение

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


final Random random = new Random();
    
public void onClick(View v) {
	mInfoTextView.setText(String.valueOf(random.nextInt()));
}

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


mInfoTextView.setText(String.valueOf(random.nextInt(6)));

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


mInfoTextView.setText(String.valueOf(random.nextInt(6) + 1));

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


String result = "";

for(int i = 0; i < 10; i++){
    result += String.valueOf(myRandom.nextInt()) + "\n";
}

mInfoTextView.setText(result);

Генерация в определённом интервале

Нужны случайные числа от 100 до 200? Пишем код.


int min = 100;
int max = 200;
int diff = max - min;
Random random = new Random();
int i = random.nextInt(diff + 1);
i += min;

Случайные цвета

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


public void onClick(View view) {
    Random random = new Random();
    // Массив из пяти цветов
    int colors[] = { Color.BLUE, Color.GREEN, Color.MAGENTA, Color.RED,
            Color.CYAN };
    int pos = random.nextInt(colors.length);
    // Меняем цвет у кнопки
    mButton.setBackgroundColor(colors[pos]);
}

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

Лотерея "6 из 49"

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


public void onClick(View v) {
    ArrayList<Integer> lotteryList = getRandomNumber();
    Log.i("Lottery", "" + lotteryList.get(0) + "," +
            lotteryList.get(1) + "," +
            lotteryList.get(2) + "," +
            lotteryList.get(3) + "," +
            lotteryList.get(4) + "," +
            lotteryList.get(5));
}

private ArrayList<Integer> getRandomNumber() {
    ArrayList<Integer> numbersGenerated = new ArrayList<>();

    for (int i = 0; i < 6; i++) {
        Random randNumber = new Random();
        int iNumber = randNumber.nextInt(48) + 1;

        if (!numbersGenerated.contains(iNumber)) {
            numbersGenerated.add(iNumber);
        } else {
            i--;
        }
    }
    return numbersGenerated;
}

SecureRandom

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


SecureRandom secureRandom = new SecureRandom();
mInfoTextView.setText(String.valueOf(secureRandom.nextInt(6)));

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

В Java 7 появился новый класс java.util.concurrent.ThreadLocalRandom. В Java 8 появился ещё один класс SplittableRandom.

Реклама