Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
0 / 0 / 2
Регистрация: 02.06.2016
Сообщений: 32
1

У меня непонятки с методами Math.random() и Random()

02.06.2016, 20:11. Просмотров 3903. Ответов 12
Метки нет (Все метки)


Задача : заполнить массив из 15 элементов случайным образом вещественными значениями х (-5 <= x <= 5)

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
class Massiv {
    public static void main(String[] args) {
        double nums[] = new double[15];
 
        for (int i = 0; i < 15; i++)
            nums[i] = ((Math.random() * 10) -5);
 
        System.out.println("Введен массив: ");
        System.out.println();
        for (int i = 0; i < 15; i++)
            System.out.println(" " + nums[i]);
    }
}
При (nums[i] = ((Math.random() * 10) -5) х может быть равен -5.0 но никогда не будет равен 5.0

Метод Random() из java.util.Random дает тот же результат(то есть х может быть равен -5.0 но никогда не будет равен 5.0):

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.util.Random;
 
class Massiv {
    public static void main(String[] args) {
        double nums[] = new double[15];
        Random rand = new Random();
 
        for (int i = 0; i < 15; i++)
            nums[i] = ((rand.nextDouble() * 10) - 5);
 
        System.out.println("Введен массив: ");
        System.out.println();
        for (int i = 0; i < 15; i++)
            System.out.println(" " + nums[i]);
    }
}
Попытка начинающего java программиста дать возможность х быть равным 5 :

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Massiv {
    public static void main(String[] args) {
        double nums[] = new double[15];
 
        for (int i = 0; i < 15; i++) {
            nums[i] = (((Math.random() * 10) - 5) + 1);
            if (nums[i] > 5) nums[i] = 5.0;
        }
 
        System.out.println("Введен массив: ");
        System.out.println();
        for (int i = 0; i < 15; i++)
            System.out.println(" " + nums[i]);
    }
}
Однако при таком раскладе шанс выпадания 5.0 будет слишком велик намного больше других чисел(несправедливо ето как то)
Как сделать грамотно чтобы -5 <= x <= 5 и чтобы шансы у всех чисел были одинаковы?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.06.2016, 20:11
Ответы с готовыми решениями:

Переделать Math.random() в random()
public static void CompMove() { int x = (int) (Math.random() * 3), y = (int) (Math.random() *...

Math.random
Подскажите пожалуйста, не могу сообразить: мне надо, получить вещественное рандомное число от...

Math.random()
Как сделать случайное число от a до b, в примере ниже a=155, b=158. Этот должен выводить случайное...

Math.random(), BD, Array
Народ нужна помощь! Есть код: for(int i = 0; i&lt;5;i++){ int x = (a + (int) (Math.random() *...

12
154 / 153 / 53
Регистрация: 30.04.2016
Сообщений: 321
02.06.2016, 20:26 2
Есть Random.nextInt(int)
То же самое можно сделать так: (int) Math.random() * 11 - 5.
Общая формула: (int) Math.random() * n + k , где n - количество чисел, k - смещение.

Edit: Прочитал невнимательно, вопрос не про целые значения, сейчас подумаю.
Не думаю что это возможно сделать чтобы прям с одинаковой частотой было, потому что числа с плавающей точкой не точные, я бы решал исходя из -5 <= x < 5.
0
0 / 0 / 2
Регистрация: 02.06.2016
Сообщений: 32
02.06.2016, 20:42  [ТС] 3
то есть для вещественных чисел верхнюю границу сделать так х <= 5 нормально нельзя и лучше над етим не париться?
0
154 / 153 / 53
Регистрация: 30.04.2016
Сообщений: 321
02.06.2016, 20:55 4
Ну сколько чисел на промежутке [-5; 5) - бесконечно много, и ради вот одного значения 5.0 мучаться?

Есть равные промежутки [0; 1) [1; 2) [2; 3) [3; 4) [4; 5). Чтобы запихнуть одно значение 5.0 с такой же вероятностью как и любое значение из промежутков, надо наверно знать вероятность выпадения отдельного значения, но их то бесконечно много.
0
0 / 0 / 2
Регистрация: 02.06.2016
Сообщений: 32
02.06.2016, 20:58  [ТС] 5
Все верно и нафик оно ето значение не нужно но ради спортивного интереса... да и задача поставлена.Любопытно же
0
Эксперт Java
4072 / 3806 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
03.06.2016, 14:43 6
Как-то так:
Java
1
2
3
4
5
6
7
8
    public static double randomInRange(double min, double max) {
        ThreadLocalRandom random = ThreadLocalRandom.current();
        if (random.nextBoolean()) {
            return (1 - random.nextDouble()) * (max - min) + min;
        } else {
            return random.nextDouble(min, max);
        }
    }
0
154 / 153 / 53
Регистрация: 30.04.2016
Сообщений: 321
03.06.2016, 14:55 7
turbanoff, в 50% будет промежуток [min, max) и в других 50% будет (min, max]. Это не равнораспределенная вероятность, у мин+макс вместе вероятность как у любого значения из промежутка.
0
Эксперт Java
4072 / 3806 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
03.06.2016, 15:35 8
ninjacut, ты прав. Честное распределение сделать сложно/невозможно используя стандартное API
0
143 / 115 / 61
Регистрация: 13.01.2016
Сообщений: 305
03.06.2016, 15:50 9
ninjacut, на всякий случай - все же (int) ( n * Math.random() + m), так как без скобок первым выполнится приведение типов, и n * Math.random() станет равным нулю.
0
154 / 153 / 53
Регистрация: 30.04.2016
Сообщений: 321
04.06.2016, 11:23 10
Пришла мне мысль, что можно получить числа из промежутка [-5; 5] с опеределенной точностью, вот например с точностью до двух знаков после запятой:
Java
1
double number = ((int) (Math.random() * 1001) - 500) / 100.0;
0
0 / 0 / 2
Регистрация: 02.06.2016
Сообщений: 32
04.06.2016, 12:25  [ТС] 11
Вот ето уже интересно -- Осмысливаю.
Не могу врубиться как получается точность 2 знака после запятой объясните плис
0
154 / 153 / 53
Регистрация: 30.04.2016
Сообщений: 321
04.06.2016, 12:34 12
Лучший ответ Сообщение было отмечено 1m0n2 как решение

Решение

1m0n2,
(int) (Math.random() * 1001) - 500) - дает целые числа в диапазоне [-500; 500] : 342 например,
Мы это делим на 100.0 = 3.42, вот и получается что 2 знака после запятой.
0
0 / 0 / 2
Регистрация: 02.06.2016
Сообщений: 32
04.06.2016, 12:47  [ТС] 13
Врубился
Канает как вариант в случае надобности
Только точность надо уточнять(в смысле можно и три знака сделать и больше да?)
Прикольнаааа

Добавлено через 7 минут
Вот сделал три знака после запятой:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
class Massiv2 {
    public static void main(String[] args) {
        double nums[] = new double[15];
 
        for (int i = 0; i < 15; i++) 
            nums[i] = ((int) (Math.random() * 10001) - 5000) / 1000.0;
 
        System.out.println("Введен массив: ");
        System.out.println();
        for (int i = 0; i < 15; i++)
            System.out.println(" " + nums[i]);
    }
}
здоравааааа
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.06.2016, 12:47

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Math.Random() без диапозона
Math.Random() дает нам числа из какого-то заданного диапазона. как получить без диапазона?

Math.random() управление рандомом
Можно ли управлять рандомом задавая время в unix виде от которого и будет выдаваться число? Знаю...

Graphics2D почему не срабатывает Math.Random?
Дошел до Graphics2D, набрал пример с книги и не работает Сам код: import java.awt.Color;...

Как работает Math.random()
Здравствуйте, вот начал осваивать новый язык, хочу заполнить массив числами от 1 до 100 for (int...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.