Освой программирование играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Класс java.util.Random представляет собой генератор псевдослучайных чисел.
Класс представлен двумя конструкторами
Так как класс создаёт псевдослучайное число, то задав начальное число, вы определяете начальную точку случайной последовательности. И будете получать одинаковые случайные последовательности. Чтобы избежать такого совпадения, обычно используют второй конструктор с использованием текущего времени в качестве инициирующего значения.
Методы:
Пример для вывода случайного числа.
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]);
}
Щёлкая по кнопке, вы будете менять её цвет случайным образом.
Сформируем шесть случайных чисел из 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;
}
Стандартный класс 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.