В проекте, в котором я работаю, мне необходимо либо генерировать n случайных double
чисел (в зависимости от того, что говорит входной файл), либо преобразовать их в doubles
если у меня есть их из моего входного файла. Эти числа должны иметь только 2 десятичных знака после запятой (например: 0.98
).
Я знаю, что в Java 8 есть два способа сделать это:
nthNumber = Double.parseDouble(new DecimalFormat("#.##").format(ThreadLocalRandom.current().nextDouble(0,1)).replace(",","."));
nthNumber = Double.parseDouble(new DecimalFormat("#.##").format(new Random().nextDouble()).replace(",", "."));
Асимптотически, что является самым быстрым? Из моего плохого знания ADS я бы сказал, что это будет одно и то же время (O(n)
?), Но я не уверен на 100%
Помимо этих двух способов, существуют ли другие способы генерации случайных doubles
между 0
и 1
которые быстрее, асимптотически, чем мои предложения? (скорее, существуют ли методы, которые могут делать все в O(n)
или O(1)
?)
Заранее благодарю всех, кто потратит минуту, чтобы ответить на этот вопрос моего
Оба ваших подхода используют строки как промежуточное представление, это будет довольно неэффективно (выделение памяти, синтаксический анализ строк, форматирование строк - относительно медленные операции. Возможно, вы также захотите избежать выделения нескольких экземпляров Random.
Учитывая, что вам нужны только две десятичные цифры, почему бы не создать целое число в диапазоне 0..99 и разделить его на 100.0?
Random random = new Random(); // Only one instance needed.
for (int n = 0; n < total; n++) {
double nthRandomNumber = random.nextInt(100) / 100.0;
}
Ваш код выглядит сложным.
Вы считали следующее:
DecimalFormat decimalFormat = new DecimalFormat("0.00");
String twoDigitRandom = decimalFormat.format(Math.random());
Ссылка: https://docs.oracle.com/javase/7/docs/api/java/lang/Math.html#random()
Возвращает двойное значение с положительным знаком, большим или равным 0.0 и менее 1.0.
Редактировать: Добавлено после комментария:
Если вы хотите контролировать количество цифр и не иметь String в качестве конечного результата, тогда я бы посоветовал не использовать Double, вместо этого попробуйте BigDecimal:
MathContext m = new MathContext(3);
BigDecimal randomWithTwoDigits = new BigDecimal(Math.random(), m);
Math.random()