1

我需要在两个给定值之间使用 Math.random() 生成随机数,但在比较时忽略两个给定值或仅一个,具体取决于具体情况。

这些是要做的值:

介于 -7 和 0 之间,不包括 0。
介于 0 和 4 之间,这两个值都被排除。
4 到 5 之间,不包括 4。

我已经尝试过第一种情况下的代码:

double fv = (-7) + Math.random() * (0 -7);
System.out.println(fv);

但它给了我奇怪的结果,比如-13.00123。

这是为了学位练习,所以我必须保持简单。

有任何想法吗?

4

5 回答 5

0

生成一个介于 -7 和 0 之间的数字,不包括 0。

      double w = (Math.random() - 1) * 7;

当随机数 = 0 时,所需值为 -7。但是所需的值永远不会是 0,因为Math.random()永远不会是 1。

对于其他人

      // between 0 and 4 both values excluded.
      double r = Math.random();
      double x = (-3 * r); // -3 < x <= 0
      double xx = r + 3; // 3 <= xx < 4
      x += xx; // 0 < x < 4

      // between 4 and 5 excluding 4
      double w = (-1 * Math.random()); // -1 < w <= 0
      w += 5; // 4 < w <= 5

于 2019-11-18T13:47:37.540 回答
0

范围内随机数的正确公式是Min + (Math.random() * (Max - Min))(包括下限和不包括上限)。
对于您的数字,正确的方法是

double fv = (-7) + Math.random() * (0 - -7);

由于您-在公式中仅使用了一个,Min因此假定值是 7 而不是 -7,这会导致错误的结果。

于 2019-11-18T13:47:49.870 回答
0
double fv = (-7) + Math.random() * 7;
System.out.println(fv);

在(包括)0.0 和 1.0(不包括 1.0 本身)之间创建一个随机双精度数。乘以 7 得到 0 到 6.99[...]9 的假设范围。减去 7 使随机数的范围从 -7 到 0.00[...]01 您可以使用此信息以类似的方式扣除所需随机数的公式。

于 2019-11-18T13:50:36.747 回答
0

您可以设置一个枚举来确定包容性。

import java.util.concurrent.ThreadLocalRandom;

public class RandomUtil {
    private enum Inclusivity { INCLUSIVE, EXCLUSIVE; }

    public static double randomDouble(double minValue, double maxValue) {
        return randomDouble(minValue, maxValue, Inclusivity.INCLUSIVE, Inclusivity.EXCLUSIVE);
    }

    public static double randomDouble(double minValue, double maxValue, Inclusivity minInclusivity, Inclusivity maxInclusivity) {
        if (minInclusivity == Inclusivity.EXCLUSIVE) {
            minValue += 1;
        }

        if (maxInclusivity == Inclusivity.INCLUSIVE) {
            maxValue += 1;
        }

        return ThreadLocalRandom.current().nextDouble(minValue, maxValue);
    }

    public static void main(String[] args) {
        System.out.println(randomDouble(-7, 0, Inclusivity.INCLUSIVE, Inclusivity.EXCLUSIVE)); // default
        System.out.println(randomDouble( 0, 4, Inclusivity.EXCLUSIVE, Inclusivity.EXCLUSIVE));
        System.out.println(randomDouble( 4, 5, Inclusivity.EXCLUSIVE, Inclusivity.INCLUSIVE));
    }
}

于 2019-11-18T13:52:57.743 回答
0

尝试这个

Random random = new Random();
random.ints(1, -7, 0).forEach(System.out::println);

ints() 方法中的最后一个值将被排除。

于 2019-11-18T13:58:22.190 回答