【问题标题】:Generate Random X.XXX numbers between [-2, 2]生成 [-2, 2] 之间的随机 X.XXX 数字
【发布时间】:2020-08-10 11:26:56
【问题描述】:
x = rd.nextInt((4000) - 2000) / 1000.0;

这是在 [0, 2] 到千位小数之间生成数字,这是我想要的,我只需要负数,因此生成的数字范围在 [-2, 2] 之间。

【问题讨论】:

    标签: java


    【解决方案1】:

    您可以在 [0,4] 范围内生成随机数,然后简单地从结果中减去 2:

    x = (rd.nextInt(4000) / 1000.0) - 2;
    

    【讨论】:

    • 出了什么问题:x = rd.nextInt(4000) / 1000.0 - 2;
    • @TomDeConinck 抱歉,我没有给予足够的关注,只是把原来的帖子翻了一番。感谢您指出。
    【解决方案2】:

    浮点数并不总是有精确的位数。此外,小数点后第三位称为千分位(小数点后的百分之一是. 之后的第二个数字)。我想你知道这一点,因为你除以一千。所以,第一步:在04 之间生成一个随机值作为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;
        

        解开这里发生的事情:

        1. 在 0.000000 和 1.000000 之间生成随机双精度
        2. 乘以范围的比例,所以我们得到一个介于 0.000000 和 4.000000 之间的数字
        3. 减去 2,所以我们得到一个介于 -2.000000 和 2.000000 之间的数字
        4. 乘以 1000,得到一个介于 -2000.000000 和 2000.000000 之间的数字
        5. 转换为 int 以截断分数,因此我们得到一个介于 -2000 和 2000 之间的 int
        6. 除以 1000d(这是一个双精度数),所以我们得到一个介于 -2.000 和 2.000 之间的双精度数

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-06-25
          • 2019-05-24
          • 2018-01-25
          • 1970-01-01
          • 1970-01-01
          • 2012-11-19
          • 2014-07-06
          相关资源
          最近更新 更多