Генерация случайных числа из определенного диапазона в Java
Я видел сообщения, которые объясняют в значительной степени этот вопрос, но все они использовали целочисленные значения, и я честно не полностью понимаю его, поэтому этот вопрос:
Я пытаюсь генерировать случайные числа из диапазона (-1554900.101) до (52952058699.3098) на java, и мне было интересно, может ли кто-нибудь объяснить это мне, как я действительно хочу это понять.
мои мысли: будет ли это правильным подходом? 1) сгенерируйте случайное целое число в пределах моего указанного диапазона Два) Разделите сгенерированное число на pi, чтобы получить float / double random results
спасибо заранее.
5 ответов
вот идея. Вы хотите случайное число в ряд скажем [-1.1,2.2]
, чтобы начать с простого примера. Этот диапазон имеет длину 3.3 с 2.2 - (-1.1) = 3.3
. Теперь большинство "случайных" функций возвращают число в диапазоне [0,1)
, который имеет длину один, поэтому мы должны масштаб наше случайное число в нашем желаемом диапазоне.
Random random = new Random();
double rand = random.nextDouble();
double scaled = rand * 3.3;
теперь наше случайное число имеет желаемую величину, но мы должны переместить его в числовой строке между точными значениями, которые мы хотеть. Для этого шага нам просто нужно добавить нижнюю границу всего диапазона к нашему масштабируемому случайному числу, и мы закончили!
double shifted = scaled + (-1.1);
Итак, теперь мы можем собрать эти части в одну функцию:
protected static Random random = new Random();
public static double randomInRange(double min, double max) {
double range = max - min;
double scaled = random.nextDouble() * range;
double shifted = scaled + min;
return shifted; // == (rand.nextDouble() * (max-min)) + min;
}
конечно, эта функция нуждается в некоторой проверке ошибок для неожиданных значений, таких как NaN
но этот ответ необходимо проиллюстрировать общую идею.
double lower = -1554900.101;
double upper = 52952058699.3098;
double result = Math.random() * (upper - lower) + lower;
Это не так, как я бы сделал это.
- генерировать случайный двойной. Результат между 0 и 1.
- умножьте это число на (highLimit-lowLimit) (52952058699.3098 - -1554900.101)
- добавить lowLimit (random + -1554900.101)
вот. У вас есть случайное число между низким и высоким пределом.
это должно быть что-то вроде:
double rnd = Math.random();
double result = ((long)(rnd * (529520586993098L - (-15549001010L) + 1)) -15549001010L) / 10000.0;
на + 1
будет балансировать за то, что диапазон [0;1[
таким образом, верхний диапазон исключен.
сначала мы пытаемся найти "целое число" (действительно длинный) диапазон, и мы добавляем 1, чтобы сбалансировать тот факт, что последнее число исключено, поэтому 529520586993098L + 15549001010L + 1
, затем умножим его на rnd
, бросил его в long
и вычесть 15549001010L
чтобы переместить его обратно и в конце концов разделить его на 10000.0
сделать это в правильном "диапазон."
это, вероятно, более ясно:
long range = 529520586993098L + 15549001010L + 1;
double temp = rnd * range;
long temp2 = (long)temp;
temp2 -= 15549001010L;
double result = temp2 / 10000.0;
случайные.nextDouble возвращает double в диапазоне [0, 1[ так что используйте это, умножьте с вашим размером диапазона (52952058699.3098 + 1554900.101), а затем смещите результат (вычитайте 1554900.101), чтобы получить свой номер.
Не уверен, насколько точно вам это нужно, хотя, не делая дальнейшего анализа, вы можете получить номера вне вашего диапазона из-за того, как обрабатываются двойники.