Одна ушла, вторая нет.
410013796724260
• Webmoney
R335386147728
Z369087728698
Генерация случайных чиселКласс Math библиотеки Java имеет метод random(), который генерирует случайное значение в диапазоне [0,1). Обратите внимание, что данный диапазон не включает 1 и при описании закрывается круглой скобкой. Можно ли предсказать сгенерированное значение? Теоретически возможно, но практически – это очень труднореализуемая задача. А поскольку существует небольшая вероятность предсказывания случайно-сгенерируемого значения, то такие числа принято называть не случайными, а псевдослучайными. Чтобы получить псевдо-случайное число в определенном диапазоне необходимо значение метода random() умножить на величину диапазона значений. Например, необходимо генерировать значение в диапазоне от min до max. В этом случае можно использовать следующий код : double d = Math.random() * (max - min) + min; Допустим, что необходимо получить значение в диапазоне [1,10), где min=1, max=10 (10 исключительно) .Алгоритм работает следующим образом : диапазон [0;1) умножается на 9=(10-1), соответственно получаем :
получаем диапазон [0,9), к которому добавляем min=1. В результате имеем :
После подстановки значений в выражение, получим : double d = Math.random() * (10 - 1) + 1; Диапазон [-10, 10)Чтобы получить псевдослучайное число в диапазоне от -10 до 10 (исключительно), необходимо значение Math.random() умножить на 20 и вычесть 10, как это представлено в следующем примере : // после подстановки значений double d = Math.random() * (10 - (-10)) + (-10); // получаем double d = Math.random() * 20 - 10; Генерирование целочисленных псевдослучайных значенийДля генерирования целочисленных псевдослучайных значений используется представленное выше выражение, в котором произведение «приводится» к целочисленному значению. Например, попробуем получить псевдослучайное значение в диапазоне [5,20]. Обратите внимание, что закрывающаяся скобка квадратная, т.е. 20 входит в диапазон. В этом случае к разности между максимальным и минимальным значениями следует добавить 1, т.е. определить диапазон целочисленных значений [5,21), где 21 не попадает в желаемый диапазон : // после подстановки значений int i = (int)Math.random() * (20 - 5 + 1) + 5; // получаем int i = (int)Math.random() * 16 + 5; Класс RandomВ качестве генератора псевдослучайных чисел можно также использовать класс java.util.Random, имеющий два конструктора : public Random(); public Random(long); Поскольку Random создаёт псевдослучайное число, то определив начальное число, устанавливается начальная точка случайной последовательности, способствующая получению одинаковых случайных последовательностей. Чтобы избежать такого совпадения, обычно применяют второй конструктор с использованием в качестве инициирующего значения текущего времени. В таблице представлены наиболее часто используемые методы генератора Random :
Пример получения псевдослучайного целочисленного значения с использованием класса Random : Random random = new Random(); int i = random.nextInt(); С классом Random алгоритм получения псевдослучайного числа такой же, как и у метода random класса Math. Допустим, что нам необходимо получить случайное число в диапазоне [5,100], 100 включительно. В этом случае код может выглядеть следующим образом : int min = 5; int max = 100; int diff = max - min; Random random = new Random(); int i = random.nextInt(diff + 1) + min; Класс SecureRandomДля криптографии следует применять класс SecureRandom, использующий криптографически сильный генератор случайных чисел (random number generator RNG). В следующем примере формируется массив псевдослучайных значений типа byte : SecureRandom random = new SecureRandom(); byte bytes[] = new byte[8]; random.nextBytes(bytes); Этот же массив можно сформировать методом generateSeed : byte seed[] = random.generateSeed(8); Пример использования SecureRandom представлен на странице Симметричного шифрования. Класс ThreadLocalRandomВ JDK 7 включен класс ThreadLocalRandom из многопоточного пакета java.util.concurrent, который следует использовать для получения псевдослучайных значений в многопоточных приложениях. Для получения экземпляра ThreadLocalRandom следует использовать статический метод current() данного класса. Пример : ThreadLocalRandom random = ThreadLocalRandom.current(); System.out.println("Random values : "); System.out.println("boolean : " + random.nextBoolean()); System.out.println("int : " + random.nextInt ()); System.out.println("float : " + random.nextFloat ()); System.out.println("long : " + random.nextLong ()); System.out.println("int from 0 to 5 : " + random.nextInt(5)); System.out.println("long from 5 to 15 : " + random.nextLong(5, 15)); |