Страницы

Поиск по вопросам

вторник, 28 января 2020 г.

Заполнение массива случайными числами из диапазона [-15,15] с помощью Math.random

#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));

Комментариев нет:

Отправить комментарий