Самый быстрый способ генерировать случайное двойное число в Java

2

В проекте, в котором я работаю, мне необходимо либо генерировать n случайных double чисел (в зависимости от того, что говорит входной файл), либо преобразовать их в doubles если у меня есть их из моего входного файла. Эти числа должны иметь только 2 десятичных знака после запятой (например: 0.98).

Я знаю, что в Java 8 есть два способа сделать это:

  1. Java 8-way: nthNumber = Double.parseDouble(new DecimalFormat("#.##").format(ThreadLocalRandom.current().nextDouble(0,1)).replace(",","."));
  2. Старый способ: nthNumber = Double.parseDouble(new DecimalFormat("#.##").format(new Random().nextDouble()).replace(",", "."));

Асимптотически, что является самым быстрым? Из моего плохого знания ADS я бы сказал, что это будет одно и то же время (O(n)?), Но я не уверен на 100%

Помимо этих двух способов, существуют ли другие способы генерации случайных doubles между 0 и 1 которые быстрее, асимптотически, чем мои предложения? (скорее, существуют ли методы, которые могут делать все в O(n) или O(1)?)

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

  • 0
    Как насчет Math.random()
  • 0
    Это быстрее, чем Random (). NextDouble () или ThreadLocalRandom.current.nextDouble ()?
Показать ещё 8 комментариев
Теги:
algorithm
time

2 ответа

8
Лучший ответ

Оба ваших подхода используют строки как промежуточное представление, это будет довольно неэффективно (выделение памяти, синтаксический анализ строк, форматирование строк - относительно медленные операции. Возможно, вы также захотите избежать выделения нескольких экземпляров 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;
}
  • 0
    Вы абсолютно правы, Стефан, я никогда не думал об этом подходе для генерации случайных чисел! Я делаю все эти сложные вещи, потому что иногда у меня могут быть значения, которые мне нужны из входного файла
  • 0
    Не думаете ли вы, что если важно количество цифр (точность), то использование Double не рекомендуется?
Показать ещё 1 комментарий
1

Ваш код выглядит сложным.

Вы считали следующее:

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);
  • 0
    Мне нужен дубль, поэтому я делаю все эти сложные вещи и разбираю
  • 0
    Хорошо, я добавил второй вариант. BigDecimal более естественно, если вы хотите контролировать количество цифр.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню