簡體   English   中英

Math.random()使用安全嗎?

[英]Is Math.random() safe to use?

我有一個生成隨機整數的方法。 我不想重復整數,所以我創建了這段代碼-

int prevInt = 0;

private int randomInt() {
    int random = (int) (Math.random() * 3);
    //generate random numbers between 0 to 3 inclusive

    if(random == prevInt)
        return randomInt();
    //if previous random number is equal to currently generated
    //random number, then call this method again for a different
    //random number

    prevInt = random;
    return random;
    //else return the generated random number
}

上面的代碼安全使用嗎? 在最壞的情況下,由Math.random() * 3生成的所有隨機整數是否可能都相同?

private final Random random = new Random();

private int randomInt(final int prev, final int max) {
  final int next = random.nextInt(max - 1);
  if(next >= prev){
    return next + 1;
  }else{
    return next;
  }
}

這將返回一個介於0和max之間的int,而無需重復。

public static double random()

返回一個帶正號精度值,大於或等於0.0且小於1.0。 從該范圍(近似)均勻分布偽隨機地選擇返回值。

生成隨機 (真正的偽隨機)數有兩種主要方法

  1. Random類生成各種范圍內的隨機整數,雙精度數,長整型等。

  2. 靜態方法Math.random生成介於0(含)和1(不含)之間的雙精度值。

生成隨機整數:

不要使用Math.random (它會生成雙精度數,而不是整數),請使用Random類來生成0到N之間的隨機整數。要生成一系列作為單元的隨機數,您需要使用單個Random對象-不要創建每個新的隨機數都有一個新的Random對象。

其他替代方法是:

SecureRandom, a cryptographically strong subclass of Random
ThreadLocalRandom, intended for multi-threaded cases

請看看這篇文章。 SO參考1參考2

從javadoc中, Math.random()返回該范圍內的偽隨機數和(近似)均勻分布數。

因此,當您不嚴格要求准確性時,可以使用它。 否則,尋求更好的解決方案。

試試這個瑣碎的代碼,自己看看

    for (int ran = 0; ran < 10; ran++) {
        int random = (int) (Math.random() * 3);
        System.out.println(random);
    }

就我而言

2 2 0 2 1 0 0 0 2 1

是的,它很安全,但是我們永遠不知道會發生什么,因此我們可以簡單地將Math.random乘以兩次以保持良好的安全性

首先,我必須指出,您的問題標題不清楚。 安全可能意味着各種事情。 在這種情況下,我認為您是指代碼算法的安全性,而不是安全性,也不是Math.random()。

不幸的是,您的代碼在算法上並不安全。 即使Math.random是安全的,您的代碼也始終可以隨時運行:粗略地說,這意味着無法保證您的代碼在有限的時間內結束。

假設您正在4個數字中取隨機數。 如果您要繪制隨機數( 不包括數字前的數字),則實際上不是從4個數字中繪制:是3。我建議另一種方法:

int prevInt = -1;

private int randomInt() {
    if (prevInt == -1) {
        int random = (int) (Math.random() * 4);
        //generate random numbers between 0 to 3 inclusive
    } else if
        int random = (int) (Math.random() * 3);
        random = (random >= prevint) ? (random + 1) % 4 : random;
    }

    prevInt = random;
    return random;
}

private void resetRandom() {
    prevInt = -1;
    //use when you want to reset information that you have 'before' result.
}

該算法在有限時間內結束。 擔心Math.Random()本身是否很危險,或者其他好家伙會解釋什么。

暫無
暫無

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

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