#java #массивы
Не получается вывести массив из 12 случайных чисел из промежутка [-15,15]: int[] array; array = new int[12]; for (int i = 0; i < array.length; i++) { array[i] = ((int)(Math.random() * 12) - 15); System.out.println(array[i]); } выводит только отрицательные числа
Ответы
Ответ 1
Смотрите документацию. Math.random() возвращает число типа double от 0 до 1. Вы зачем-то множите это значение на 12. По сути, у вас интервал от -15 до 15 включительно, плюс 0, т.е. диапазон 31. Согласны? Вот 31 и надо множить на Math.random() - будете получать числа от 0 до 30. Чтобы получить не от 0 до 30, а от -15 до 15, нужно отнять 15, что вы совершенно верно сделали. UPD. Обновил ответ, спасибо за исправление. Первоначально была такая мысль: int[] array = new int[12]; for (int i = 0; i < array.length; i++) { array[i] = (int) Math.round((Math.random() * 30) - 15); System.out.println(array[i]); } Но немного подумал и понял, что значения будут не совсем корректные, да и ответ @Regent попроще.Ответ 2
Проблема в том, что (int)(Math.random() * 12) генерирует числа от 0 до 11, а нужно генерировать от 0 до 30: int[] array = new int[12]; for (int i = 0; i < array.length; i++) { array[i] = ((int)(Math.random() * 31) - 15); System.out.println(array[i]); } Пример в fiddle.Ответ 3
Использование Math.random() обязательно? Зачем генерировать дроби если всё равно нужны целые числа? Ведь гораздо проще использовать nextInt(int bound) класса java.util.Random. Returns a pseudorandom, uniformly distributed int value between 0 (inclusive) and the specified value (exclusive), drawn from this random number generator's sequence. (Из документации) Итак, этот метод генерирует случайные целые числа из диапазона [0, bound). Нам нужен диапазон [-15, 15], т.е. [-15, 16). Для получения чисел из такого диапазона нужно: Сгенерировать числа из положительного диапазона, по длине равному диапазону из условия. Т.е. получаем диапазон [0, 16+15) = [0, 31) Вычесть из каждого полученного числа 15, т.е. сдвинуть диапазон на 15 вправо. В итоге, строка array[i] = ((int)(Math.random() * 12) - 15); заменяется на array[i] = random.nextInt(31) - 15;. Объект random нужно создать где-нибудь перед выполнением цикла. Теперь замечания по коду. Зачем разбивать объявление и присвоение? 2 первые строки лучше объединить: int[] array = new int[12]; В вопросе написано, что массив нужно просто вывести. Нужно ли его хранить? Если нет, то лучше генерировать числа и тут же их выводить: for(int i = 0; i < 12; i++){ System.out.println(random.nextInt(31) - 15); }Ответ 4
private static Random rand = new Random(); public static int getRandom(int lo, int hi) { return lo + rand.nextInt(hi - lo + 1); } // getRandomОтвет 5
Можно и так: array[i] = ((int)(Math.random()*16) - (int)(Math.random()*16));
Комментариев нет:
Отправить комментарий