为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Math.random() 和 ThreadLocalRandom.current()

使用 Math.random() 和 ThreadLocalRandom.current()

ibeautiful 2023-06-21 13:31:25
Java 中的 BankApplication 程序,setDebitCard()功能问题。在这里,我无法在每次java 运行变量后生成唯一的随机数debitCardNumber,而它与debitCardPin.nextDouble(),Math.random()我也尝试使用 Random class method ThreadLocalRandom.current().nextDouble()..问题:debitCardNumber尝试上述所有操作后,输出是相同的。(没有任何语法错误)另外,我得到的是相同的 10 位数字,debitCardNumber而不是 12 位数字。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() codeprivate 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));    }预期结果:debitCardNumber每次JAVA RUN后应返回一个唯一的随机 12 位整数debitCardPin应该只返回 4 位整数。实际结果:debitCardNumber每次JAVA RUN后返回相同的 10 位整数debitCardPin有时返回一个 3 位唯一随机整数。
查看完整描述

2 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

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


所以你需要让这个领域成为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);

不需要将数字转换为long或int显式地存在一些方法,这些方法将在给定和值的情况下ThreadLocalRandom.current()给出相应类型的数字。使用此方法,您可以放心,您始终会得到介于(包含)和(不包含)之间的值。这将解决您的问题“但有时它会给我一个唯一的 3 位数随机数。”minmaxminmax


查看完整回答
反对 回复 2023-06-21
?
心有法竹

TA贡献1866条经验 获得超5个赞

问题是 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);


查看完整回答
反对 回复 2023-06-21
  • 2 回答
  • 0 关注
  • 127 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信