【问题标题】:Getting same number when using Math.random() and ThreadLocalRandom.current().nextDouble() and Random class nextDouble() method?使用 Math.random() 和 ThreadLocalRandom.current().nextDouble() 和 Random 类 nextDouble() 方法时获得相同的数字?
【发布时间】:2019-12-31 12:41:46
【问题描述】:

Java 中的 BankApplication 程序,setDebitCard() 函数存在问题。

在这里,我无法在每次 java 运行 后为 debitCardNumber 变量生成一个唯一的随机数,而它与 debitCardPin 一起工作正常。

我尝试使用 Random 类方法 nextDouble(),Math.random(), ThreadLocalRandom.current().nextDouble() 也是..

问题:

  1. 在尝试上述所有操作后,debitCardNumber 的输出是相同的。 (没有任何语法错误)

  2. 另外,我得到相同的 10 位数 debitCardNumber 而不是 12 位数。

  3. debitCardPin 工作正常,但有时它会给我一个唯一的 3 位随机数。

代码

package bankAccountApp;

import java.util.Random;

import java.util.concurrent.ThreadLocalRandom;

public class Current extends Account {

    private int debitCardNumber;

    private int debitCardPin;

    Random rand = new Random();

//setDebitCard() code

private void setDebitCard(){

    debitCardNumber = (int)(ThreadLocalRandom.current().nextDouble()*Math.pow(10,12));


/* Also tried using

   debitCardNumber = (int)(rand.nextDouble()*Math.pow(10,12));

   debitCardNumber = (int)(Math.random()*Math.pow(10,12));

*/

    debitCardPin = (int)(Math.random()*Math.pow(10,4));
    }

预期结果:

  1. debitCardNumber 应该在每个 JAVA RUN

  2. 之后返回一个唯一的随机 12 位整数
  3. debitCardPin 应该只返回 4 位整数。

实际结果:

  1. debitCardNumber 在每次 JAVA RUN

  2. 之后返回相同的 10 位整数
  3. debitCardPin 有时会返回一个 3 位唯一随机整数。

【问题讨论】:

    标签: java class random


    【解决方案1】:

    问题在于,当您向下转换为 int 时,int 可以容纳的最大值是 2147483647,它是 10 位数字,因此它无法返回大于该数字的数字。

    所以你需要将debitCardNumber字段设为long

    private long debitCardNumber;
    

    将代码更改为获取 12 位数字的代码:

    long min = (long)Math.pow(10, 11);
    long max = (long)Math.pow(10, 12);
    long debitCardNumber = ThreadLocalRandom.current().nextLong(min,  max);
    

    对于 4 位数字 debitCardPin

    int debitCardPin = ThreadLocalRandom.current().nextInt(1000, 10000);
    

    无需将数字显式转换为longintThreadLocalRandom.current() 上的方法将根据minmax 值给出相应的数字类型。使用这种方法,您可以放心,您始终会获得介于 min(含)和 max(不含)之间的值。这将解决您的问题“但有时它会给我一个唯一的 3 位随机数。”

    【讨论】:

    • 非常感谢@Amardeep Bhowmick 它工作了。你不认为我们应该在long debitCardNumber = ThreadLocalRandom.current().nextLong(min, max); 中写max+1 也仍然不明白为什么只有2147483647 是被重复了。应该是任意 10 位数字 int<=2147483647
    • @SohailShaikh 不,我们不需要写max +1,因为结束编号是唯一的,所以如果我给出 10000,它只会生成高达 9999 的值。你得到的值 2147483647 总是您生成的 12 位数字被向下转换为 int,但 int 的最大可能值是 2147483647,因此结果始终是 int 的最大值。
    【解决方案2】:

    问题是 int。它太小了(这里有溢出)。

    你可以试试下面的代码:

    double rndValue = (ThreadLocalRandom.current().nextDouble() * Math.pow(10, 12));
    DecimalFormat formatter = new DecimalFormat("##");
    formatter.setRoundingMode(RoundingMode.DOWN);
    String result = formatter.format(rndValue);
    System.out.println(result);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多