我想在java中生成隨機數,我知道我應該使用Math.random()這樣的現有方法,但是,我的問題是:如何生成相同的數字序列,每次我運行我的應用程序? 例如:生成的順序是:0.9,0.08,0.6 所以我想,這個序列將我每次執行該方法時產生..生成相同的隨機數序列
17
A
回答
29
當然 - 只需創建的,而不是使用Math.random()
的Random
一個實例,始終指定相同的種子:
Random random = new Random(10000); // Or whatever seed - maybe configurable
int diceRoll = random.nextInt(6) + 1; // etc
請注意,如果您的應用程序涉及多個線程,則會變得更難,因爲時序變得難以預測。
這利用了Random
是一個pseudo-random number generator - 換句話說,每次你問它一個新的結果,它操縱內部狀態給你一個隨機看看的序列,但知道種子(或實際上是當前的內部狀態),這是完全可預測的。
6
您需要種子隨機數發生器。
Random random = new Random(aFixedNumber);
random.nextInt(); // will always be the same
24
反覆使用相同種子的示例。
public static void main(String... args) throws IOException {
printDoublesForSeed(1);
printDoublesForSeed(128);
printDoublesForSeed(1);
printDoublesForSeed(128);
}
private static void printDoublesForSeed(long seed) {
double[] doubles = new double[10];
Random rand = new Random(seed);
for (int j = 0; j < doubles.length; j++) {
doubles[j] = (long) (rand.nextDouble() * 100)/100.0;
}
System.out.println("doubles with seed " + seed + " " + Arrays.toString(doubles));
}
打印
doubles with seed 1 [0.73, 0.41, 0.2, 0.33, 0.96, 0.0, 0.96, 0.93, 0.94, 0.93]
doubles with seed 128 [0.74, 0.53, 0.63, 0.41, 0.21, 0.2, 0.33, 0.74, 0.17, 0.47]
doubles with seed 1 [0.73, 0.41, 0.2, 0.33, 0.96, 0.0, 0.96, 0.93, 0.94, 0.93]
doubles with seed 128 [0.74, 0.53, 0.63, 0.41, 0.21, 0.2, 0.33, 0.74, 0.17, 0.47]
編輯的隨機種子的一個有趣的濫用。
public static void main(String ... args) {
System.out.println(randomString(-6225973)+' '+randomString(1598025));
}
public static String randomString(int seed) {
Random rand = new Random(seed);
StringBuilder sb = new StringBuilder();
for(int i=0;i<5;i++)
sb.append((char) ('a' + rand.nextInt(26)));
return sb.toString();
}
打印
hello world
4
Math.random
僅僅是一個類java.util.Random
的包裝。第一次調用Math.random
時,會創建類java.util.Random
的實例。
現在,大多數API不會公開任何true隨機數發生器,因爲它們不能在軟件中實現。相反,他們使用僞隨機數字發生器,它使用一組公式產生一系列隨機數字。這是java.util.Random
所做的。但是,每個僞隨機數發生器首先需要接種。如果您有兩個使用相同算法並使用相同種子的僞隨機數生成器,它們將生成相同的輸出。
默認情況下,java.util.Random
使用1970年1月1日以來的毫秒作爲種子。因此,每次啓動程序時,它都會產生不同的數字(除非您管理它在1毫秒內啓動java)。所以,解決問題的方法是自己創建自己的java.util.Random
實例和種子它:
import java.util.Random;
class ... {
Random randomNumberGenerator = new Random(199711);
public void ...()
{
int randomInt = randomNumberGenerator.nextInt();
double randomDouble = randomNumberGenerator.nextDouble();
}
}
的randomNumberGenerator
總是會吐出相同的數字序列,只要你不改變的種子( 199711
)。
0
我會硬編碼到應用程序的數字。這需要更多的內存,但速度要快得多。
只需將隨機數打印到終端,然後將其複製粘貼到您的代碼中。
一定要留下評論,解釋你做了什麼,否則他們會看起來像不知情的讀者黑魔法。
相關問題
- 1. MATLAB:生成相同的隨機數字序列
- 2. Python - 生成相同的隨機數
- 3. 生成相同的隨機數onclick
- 4. 生成大小相同的隨機數
- 5. 隨機數生成 - 數相同返回
- 6. 如何在java中生成兩次相同的隨機序列?
- 7. 如何生成相同的一系列僞隨機整數?
- 8. 隨機數發生器產生相同的隨機數
- 9. 隨機數生成 - 約束序列
- 10. 生成隨機數序列與在Java
- 11. 生成混合隨機數序列
- 12. 兩個不同的種子產生相同的「隨機」序列
- 13. C++ 11:使用C++ 11隨機數支持庫隨機數,生成相同的序列的每個運行
- 14. 生成兩個相同的隨機數和一個不同的
- 15. 相同和不同的隨機數生成
- 16. CURAND生成具有相同種子的不同隨機數
- 17. 生成 「隨機」 數是相同的javascript每次(即種子隨機數)
- 18. 通過僞隨機樸素隨機數生成器生成隨機數序列的正確方法
- 19. Haskell的隨機生成的序列
- 20. C/C++算法從不同平臺上的相同種子生成相同的僞隨機數序列?
- 21. 每次產生相同的隨機數
- 22. 生成相同隨機數的Normrnd函數
- 23. Vb.net隨機數字生成器重複相同的數字
- 24. 生成隨機數,每次給予相同數量的
- 25. 生成字符串的隨機序列
- 26. 批量隨機數生成器 - 生成與之前相同的數
- 27. 生成不同的隨機數
- 28. 生成不同的隨機數
- 29. 對於相同的種子,由rand生成的隨機數序列在C中保證總是相同的?
- 30. 「新的隨機(x)」總是生成相同的數字?
在線程的情況下,你可以給每個線程自己的隨機(固定種子),或者如果你只使用一個預先填充的列表爲每個從一個隨機(具有固定的種子)。但是,如果線程彼此交互,這種方法不會再工作了。 – Stefan