Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

псевдослучайное число из промежутка [-n;n)

32K
22 августа 2011 года
turtles
42 / / 18.02.2011
Здравствуйте! У меня вот такой вопрос по коду, подскажите по заданию я правильно написал код или что не правильно?
Вот задание:
Создайте программу, которая будет генерировать и выводить на экран
вещественное псевдослучайное число из промежутка [-3;3).
 
Код:
public class MathRandom {
    public static void main(String args[]){
      final int min = -3;
      final int max = 3;
        double  ran = Math.random()* min * max;
        System.out.println("Число из промежутка -> [-3;3) = " + ran);
    }
}
278
22 августа 2011 года
Alexander92
1.1K / / 04.08.2008
 
Код:
double ran = min + Math.random() * (max - min);
32K
22 августа 2011 года
turtles
42 / / 18.02.2011
подскажите пожалуйста как правильно вычисляется промежуток или по какой формуле
если например вот такой диапазон чисел:(-3;3),(-3;3],[-3;3] и [-3;3) или такой (-3;-3),(-3;-3],[-3;-3] и [-3;-3)
278
22 августа 2011 года
Alexander92
1.1K / / 04.08.2008
Цитата:

Math.random()
Returns a double value with a positive sign, greater than or equal to 0.0 and less than 1.0.


Отсюда следует, что только с помощью Math.random() вы никогда не получите промежуток, закрытый сверху, и никогда не получите промежуток, открытый снизу. Грубо говоря, вы никогда не получите число, строго равное max, и никогда не избавитесь от чисел, равных min. Решение этих проблем может быть следующим:

Код:
public double GetRandom(int min, int max) {
    double retVal = Math.random() * (max - min);

    // открываем промежуток снизу
    while (retVal == min)
       retVal = min + Math.random() * (max - min);

    // закрываем промежуток сверху
    if (max - retVal <= 0.0001) // точность можете задать сами
       retVal = max;

    return retVal;
}


Соответственно, если вам нужно получить промежуток, открытый сверху или закрытый снизу, убираете одно из тех ограничений, которые я привел.

P.S. Не забудьте, что любое корректирование подобного рода несколько изменяет стандартное распределение случайных чисел, которое по умолчанию генерирует Math.random(). В большинстве случаев это не критично, но ваше внимание я на это все-таки обращаю.
32K
22 августа 2011 года
turtles
42 / / 18.02.2011
Огромное спасибо за совет теперь все понятно!
360
22 августа 2011 года
P*t*
474 / / 15.02.2007
Цитата: Alexander92
Отсюда следует, что только с помощью Math.random() вы никогда не получите промежуток, закрытый сверху, и никогда не получите промежуток, открытый снизу. Грубо говоря, вы никогда не получите число, строго равное max, и никогда не избавитесь от чисел, равных min.



А как же 1 - Math.random() ?

278
22 августа 2011 года
Alexander92
1.1K / / 04.08.2008
1 - Math.random() - это хорошо, согласен, но все равно проблема остается - обязательно один конец открытый, а второй закрытый. Я это имел в виду.
297
22 августа 2011 года
koodeer
1.2K / / 02.05.2009
Заинтересовался открытыми-закрытыми промежутками, решил вставить своё мнение.

Думаю, генерируемое значение будет отличаться на машинную величину эпсилон. Это в реальном мире в математике приближение может быть бесконечным, а в мире компьютеров оно конечно. Следовательно, если random генерирует double [0, 1), а нужно, допустим, (min, max], то можно в формуле min + Math.random() * (max - min) предварительно прибавлять-отнимать значение epsilon граничным значениям: max += epsilon; min -= epsilon.
Я прав? Поправьте, если не так.

P.S. Не знаю, как в Java задана константа epsilon; в .NET это double.Epsilon.
P.P.S. Конечно, ограничение и в таком случае есть: если в качестве значений min и/или max будут Double.MIN_VALUE, Double.MAX_VALUE.
278
22 августа 2011 года
Alexander92
1.1K / / 04.08.2008
Что-то в этом, бесспорно, есть, но просто прибавлять-отнимать значения к границам не получится, нужно аккуратнее продумать. Смотрите, давайте формально заменим min => min - e, max => max + e. Скажем далее, что Math.random() генерирует значения в _замкнутом_ промежутке [0; 1-e]. Тогда наша формула представится в виде:

 
Код:
rnd = min - e + Math.random() * (max - min + 2 * e);


Подставьте туда 0 и 1-e вместо Math.random(), вы не получите требуемого интервала [min + e; max].

Upd: кстати говоря, предложенный P*t* вариант с 1-random тоже открывает нижную границу с ошибкой, отличной от машинного epsilon. Легко проверить из тех же соображений.
7
22 августа 2011 года
@pixo $oft
3.4K / / 20.09.2006
Не легче ли сравнивать полученное число со значением открытого промежутка и,если они равны,просто генерировать снова?:)
278
22 августа 2011 года
Alexander92
1.1K / / 04.08.2008
Бр, что за "значение открытого промежутка"? :) Ты о чем?

P.S. Посмотри на код, который я выше приводил, там как раз while стоит. Ты не об этом ли случайно?
7
22 августа 2011 года
@pixo $oft
3.4K / / 20.09.2006
О,может,и об этом:) Всего лишь невнимательность
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог