[英]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。 從該范圍(近似)均勻分布偽隨機地選擇返回值。
生成隨機 (真正的偽隨機)數有兩種主要方法 :
Random類生成各種范圍內的隨機整數,雙精度數,長整型等。
靜態方法Math.random生成介於0(含)和1(不含)之間的雙精度值。
生成隨機整數:
不要使用Math.random
(它會生成雙精度數,而不是整數),請使用Random
類來生成0到N之間的隨機整數。要生成一系列作為單元的隨機數,您需要使用單個Random對象-不要創建每個新的隨機數都有一個新的Random對象。
其他替代方法是:
SecureRandom, a cryptographically strong subclass of Random
ThreadLocalRandom, intended for multi-threaded cases
從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.