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);
}
}
псевдослучайное число из промежутка [-n;n)
Вот задание:
Создайте программу, которая будет генерировать и выводить на экран
вещественное псевдослучайное число из промежутка [-3;3).
Код:
Код:
double ran = min + Math.random() * (max - min);
если например вот такой диапазон чисел:(-3;3),(-3;3],[-3;3] и [-3;3) или такой (-3;-3),(-3;-3],[-3;-3] и [-3;-3)
Цитата:
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;
}
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(). В большинстве случаев это не критично, но ваше внимание я на это все-таки обращаю.
Огромное спасибо за совет теперь все понятно!
Цитата: Alexander92
Отсюда следует, что только с помощью Math.random() вы никогда не получите промежуток, закрытый сверху, и никогда не получите промежуток, открытый снизу. Грубо говоря, вы никогда не получите число, строго равное max, и никогда не избавитесь от чисел, равных min.
А как же 1 - Math.random() ?
1 - Math.random() - это хорошо, согласен, но все равно проблема остается - обязательно один конец открытый, а второй закрытый. Я это имел в виду.
Думаю, генерируемое значение будет отличаться на машинную величину эпсилон. Это в реальном мире в математике приближение может быть бесконечным, а в мире компьютеров оно конечно. Следовательно, если 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.
Код:
rnd = min - e + Math.random() * (max - min + 2 * e);
Подставьте туда 0 и 1-e вместо Math.random(), вы не получите требуемого интервала [min + e; max].
Upd: кстати говоря, предложенный P*t* вариант с 1-random тоже открывает нижную границу с ошибкой, отличной от машинного epsilon. Легко проверить из тех же соображений.
Не легче ли сравнивать полученное число со значением открытого промежутка и,если они равны,просто генерировать снова?:)
P.S. Посмотри на код, который я выше приводил, там как раз while стоит. Ты не об этом ли случайно?
О,может,и об этом:) Всего лишь невнимательность