【问题标题】:Fastest way to generate a random double number in java在java中生成随机双数的最快方法
【发布时间】:2017-01-21 01:37:02
【问题描述】:

在我正在工作的项目中,我需要生成 n 个随机的 double 数字(取决于输入文件的内容)或将它们转换为 doubles(如果我有输入)文件。这些数字在逗号后应该只有 2 位小数(例如:0.98)。

我知道在 Java 8 中,有两种方法可以做到这一点:

  1. Java 8 方式:nthNumber = Double.parseDouble(new DecimalFormat("#.##").format(ThreadLocalRandom.current().nextDouble(0,1)).replace(",","."));
  2. 旧时尚方式:nthNumber = Double.parseDouble(new DecimalFormat("#.##").format(new Random().nextDouble()).replace(",", "."));

渐近地说,哪个最快?根据我对 A.D.S. 的了解,我会说会是同一时间 (O(n)?) 但我不是 100% 确定

除了这两种方法之外,还有其他方法可以在01 之间生成随机doubles,这些方法渐近地说比我的建议更快吗? (相反,有没有方法可以在O(n)O(1) 中完成所有操作?)

提前感谢所有愿意花一分钟时间回答我这个问题的人

【问题讨论】:

  • Math.random()怎么样
  • 是否比 Random().nextDouble() 或 ThreadLocalRandom.current.nextDouble() 快?
  • 你不会比 O(n) 更好
  • 实际函数调用的持续时间与算法复杂度无关。如果此代码将在多个线程上并发执行,则只需使用ThreadLocalRandom
  • @Groo 从我对 ADS 的真正糟糕研究中,我记得函数的复杂性是由各种函数的渐近成本的乘积给出的,这就是我谈论算法复杂性的原因(但我肯定是错的)

标签: java algorithm time


【解决方案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;
}

【讨论】:

  • 你说得对,Stefan,我从没想过这种生成随机数的方法!我正在做所有这些复杂的事情,因为有时我可能会从输入文件中获得所需的值
  • 你不认为如果位数(精度)很重要,那么不建议使用Double吗?
  • @PiotrR 这个项目迫使我使用 Doubles,所以我不能使用 Float
【解决方案2】:

您的代码看起来很复杂。

您是否考虑过以下几点:

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。

编辑:在评论后添加:

如果您想控制位数而不是最终结果为字符串,那么我建议不要使用 Double,而是尝试使用 BigDecimal:

MathContext m = new MathContext(3);
BigDecimal randomWithTwoDigits = new BigDecimal(Math.random(), m);

【讨论】:

  • 我需要一个 double,这就是为什么我要做所有复杂的事情和 parseDouble
  • 好的,我添加了第二个选项。如果要控制位数,BigDecimal 更自然。
猜你喜欢
  • 2011-02-12
  • 2010-10-26
  • 2022-10-04
  • 2013-10-12
  • 2023-03-22
  • 2012-02-05
  • 2017-02-27
  • 2015-12-29
  • 2014-07-05
相关资源
最近更新 更多