生成 [-2, 2] 之间的随机 X.XXX 数字
Posted
技术标签:
【中文标题】生成 [-2, 2] 之间的随机 X.XXX 数字【英文标题】:Generate Random X.XXX numbers between [-2, 2] 【发布时间】:2020-08-10 11:26:56 【问题描述】:x = rd.nextInt((4000) - 2000) / 1000.0;
这是在 [0, 2] 到千位小数之间生成数字,这是我想要的,我只需要负数,因此生成的数字范围在 [-2, 2] 之间。
【问题讨论】:
【参考方案1】:您可以在 [0,4] 范围内生成随机数,然后简单地从结果中减去 2:
x = (rd.nextInt(4000) / 1000.0) - 2;
【讨论】:
出了什么问题:x = rd.nextInt(4000) / 1000.0 - 2; @TomDeConinck 抱歉,我没有给予足够的关注,只是把原来的帖子翻了一番。感谢您指出。【参考方案2】:浮点数并不总是有精确的位数。此外,小数点后第三位称为千分位(小数点后的百分之一是.
之后的第二个数字)。我想你知道这一点,因为你除以一千。所以,第一步:在0
和4
之间生成一个随机值作为double
。第二步:减二并转换为格式化的String
(这样就可以控制位数了)。
double d = (rd.nextDouble() * 4) - 2;
String x = String.format("%.3f", d);
【讨论】:
【参考方案3】:您可以生成一个随机浮点数,然后使用模数将其截断到小数点后百位。
int min = -2;
int max = 2;
Random rand = new Random();
float ret = rand.nextFloat() * (max - min) + min;
return ret - (ret % 0.01);
【讨论】:
【参考方案4】:您面临的问题是整数运算,它会截断结果的小数部分。改用rd.nextDouble()
,这样算术结果就是double
,它保留了小数部分。
但是,要四舍五入到 1/100,您可以使用整数算术来发挥自己的优势。
您的问题的文本到小数点后的百分之一,所以这是解决方案:
x = (int)(((rd.nextDouble() * 4) - 2) * 100) / 100d;
但是你的标题提到了X.XXX
,所以这是解决方案:
x = (int)(((rd.nextDouble() * 4) - 2) * 1000) / 1000d;
解开这里发生的事情:
-
在 0.000000 和 1.000000 之间生成随机双精度
乘以范围的比例,所以我们得到一个介于 0.000000 和 4.000000 之间的数字
减去 2,所以我们得到一个介于 -2.000000 和 2.000000 之间的数字
乘以 1000,得到一个介于 -2000.000000 和 2000.000000 之间的数字
转换为 int 以截断分数,因此我们得到一个介于 -2000 和 2000 之间的 int
除以 1000d(这是一个双精度数),所以我们得到一个介于 -2.000 和 2.000 之间的双精度数
【讨论】:
以上是关于生成 [-2, 2] 之间的随机 X.XXX 数字的主要内容,如果未能解决你的问题,请参考以下文章
随机取2个范围(例如100和150)之间的30个数字(浮点数),总计为N