Java随机生成0到0.06之间的数字

3
在Java中,我需要随机生成一个介于00.06之间的数字。
我在这里看到另一个问题上的答案,以下代码可以完成这个任务:
Random generator = new Random();
double number = generator.nextDouble() * .06;

然而,这样做会给我带来非常长的数字,例如0.0070440135891302050.03656588431980957,我认为这不是我的教练要求的。

有没有办法生成介于0和0.06之间只有两到三位小数的随机数?

4个回答

9

如果你需要一个范围在[0 - 0.06]之间,且差值为0.01的数字,可以按照以下步骤操作:

Random generator = new Random();
int number = generator.nextInt(7);
double result = number / 100.0;

您可以将公式推广到 number = generator.nextInt(max - min + 1) + min;,其中的maxmin分别表示您希望生成的最高和最低数字。这将生成一个从[min to max+1]的数字。
要增加生成数字的小数位数,只需将该数字除以适当的10的幂(例如1000、10000等)即可。

4

在内部,Java中的double值是二进制浮点表示法。它们没有小数位。您可以将double格式化为一个以指定小数位数的十进制数字字符串。例如,要获得三个小数位(精度为0.001),可以使用以下代码:

String formatted = String.format("%.3f", number);

如果您不需要对数字进行任何计算,并且想要两到三位小数,只需打印0.0,然后再打印一个介于00和60之间(含)的两位随机整数即可。


1
只是打印0.0,然后在0到60(包括边界)之间随机生成一个整数,并确保填充为两位数字,否则无法获得平坦分布。 - Mike Samuel
1
@MikeSamuel - 哎呀!你说得对。现在已经太晚了,我不应该这么做。 - Ted Hopp

3

我假设你需要保留精度至0.001,请尝试以下方法:

    Random r = new Random();
    int ret = r.nextInt(60 + 1);
    return ret / 1000.0;

这将生成 [0,0.060] 的平均值,且差异的倍数为 0.001,这可能是您想要的。


你的意思不是 int ret = r.nextInt(60) + 1 吗? - Ted Hopp
不对,Random.nextInt(n)的范围是[0, n),为了生成一个在区间[0, n]内的整数,应该使用nextInt(n+1)。 - BlackJoker
没错。你正在生成一个介于0(包括!)和60(包括!)之间的随机整数。因此,返回值范围的下限将是0.000,而不是0.001。你需要让ret成为范围在[1, 60]之间的随机整数,以产生你所声称的范围。 - Ted Hopp
作者只需要精度为0.001的0到0.06之间的数字。 - BlackJoker
@dreamcrash - OP的问题标题说“在0和0.06之间”。你为什么想生成0.1呢?那会是一个错误。 - Ted Hopp

1

2
值得注意的是,BigDecimal 执行相同操作可能比 double 慢 100 倍。而且它更长,读起来更困难,因此更容易出错,假设您知道如何对 double 进行四舍五入。;) - Peter Lawrey
@PeterLawrey,是的,有些架构没有专用的FPU,但仍有很多架构没有硬件支持十进制,因此不要在科学、统计或几何计算中使用它。 - Mike Samuel
1
@MikeSamuel 一般的安卓手机都支持FPU。我不会使用没有FPU的硬件进行科学、统计或几何计算。现在有哪些设备用于计算但没有FPU呢? - Peter Lawrey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接