2011-10-26 119 views
17

我想在java中生成隨機數,我知道我應該使用Math.random()這樣的現有方法,但是,我的問題是:如何生成相同的數字序列,每次我運行我的應用程序? 例如:生成的順序是:0.9,0.08,0.6 所以我想,這個序列將我每次執行該方法時產生..生成相同的隨機數序列

回答

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 - 換句話說,每次你問它一個新的結果,它操縱內部狀態給你一個隨機看看的序列,但知道種子(或實際上是當前的內部狀態),這是完全可預測的。

+2

在線程的情況下,你可以給每個線程自己的隨機(固定種子),或者如果你只使用一個預先填充的列表爲每個從一個隨機(具有固定的種子)。但是,如果線程彼此交互,這種方法不會再工作了。 – Stefan

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 
+2

+1爲了清楚地說明。 – mre

+2

我喜歡hello world的例子。我認爲沒有更好的解決方案,蠻力所有可能的種子找到正確的種子?編輯:顯然不是,我不應該在得到我的第一杯咖啡之前寫下東西:0 – Voo

+0

我剛用過蠻力。 ;) –

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

我會硬編碼到應用程序的數字。這需要更多的內存,但速度要快得多。

只需將隨機數打印到終端,然後將其複製粘貼到您的代碼中。

一定要留下評論,解釋你做了什麼,否則他們會看起來像不知情的讀者黑魔法。

相關問題