在java中生成随机双数的最快方法

时间:2016-09-13 12:33:33

标签: java algorithm time

在我正在工作的项目中,我需要生成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(",", "."));
  3. 渐渐地说,哪个是最快的?根据我对A.D.S.的不了解,我会说这是同一时间(O(n)?)但我不是百分百肯定

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

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

2 个答案:

答案 0 :(得分: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;
}

答案 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()

  

返回带有正号的double值,大于或等于0.0且小于1.0。

编辑:在评论后添加:

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

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