簡體   English   中英

需要在忽略給定值的兩個值之間生成隨機數

[英]Need to generate random numbers between two values ignoring the given values

我需要在兩個給定值之間使用 Math.random() 生成隨機數,但在比較時忽略兩個給定值或僅一個,具體取決於具體情況。

這些是要做的值:

介於 -7 和 0 之間,不包括 0。
介於 0 和 4 之間,這兩個值均不包括在內。
4 到 5 之間,不包括 4。

我已經嘗試過第一種情況下的代碼:

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

但它給了我奇怪的結果,比如-13.00123。

這是為了學位練習,所以我必須保持簡單。

有任何想法嗎?

生成一個介於 -7 和 0 之間的數字,不包括 0。

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

當隨機數 = 0 時,所需值為 -7。 但是所需的值 but 永遠不會是 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

范圍內隨機數的正確公式是Min + (Math.random() * (Max - Min)) (包括下限和不包括上限)。
對於您的數字,正確的方法是

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

由於您只使用了一個-在公式中, Min被假定為 7 而不是 -7,這會導致錯誤的結果。

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 您可以使用此信息以類似的方式扣除所需隨機數的公式。

您可以設置一個枚舉來確定包容性。

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));
    }
}

嘗試這個

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

ints() 方法中的最后一個值將被排除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM