2016-10-18 49 views
0

我打算使用Mersenne扭曲我可以從這裏得到:https://cs.gmu.edu/~sean/research/,但我想知道如何使用它。我做了兩個玩具的例子。你認爲哪一個更好?你有明確的選擇理由嗎?如何在Java中使用Mersenne Twister?

我想要做的就是讓高品質的僞隨機數,並確保可重複性。

例1(每個類都有自己的梅森旋轉算法實例)

class Foo { 
    public static void main(String[] args) { 
     MersenneTwister mt = new MersenneTwister(1); 
     Bar b = new Bar(); 
    } 
} 
class Bar { 
    MersenneTwister mt; 
    Bar() { 
     this.mt = new MersenneTwister(2); 
    } 
} 

例2(不同類共享一個梅森旋轉算法實例)

class Foo { 
    public static void main(String[] args) { 
     MersenneTwister mt = new MersenneTwister(1); 
     Bar b = new Bar(mt); 
    } 
} 
class Bar { 
    MersenneTwister mt; 
    Bar(MersenneTwister mt) { 
     this.mt = mt; 
    } 
} 
+0

共享爲您提供了可能的線程安全問題。小心。 –

+0

根據網頁的指示,類,梅森旋轉算法是線程安全的,但我在哪裏MT類共享可能不重複害怕多線程程序 – Nickel

+0

這是因爲mt.randInt(10)將不會以相同的順序被稱爲每次。 – Nickel

回答

0

這是不太可能有人會花時間來分析該鏈接的內容。無論如何,除了知道其它事情之外,我不喜歡Example#1,原因很簡單:mt在您的主要方法中完全沒有使用。

MersenneTwister mt = new MersenneTwister(1); 

這行代碼是沒有從不同...

new MersenneTwister(1); 

...和該行代碼用於在堆中沒有(表觀的)目的以外浪費CPU週期,空間,並可能拋出異常。

你的第二個例子,在另一方面,將給您如何Bar作品更多的靈活性。它通過讓你指定新的Bar實例的狀態來完成這個任務,而不是所有的Bar都被初始化爲一些神奇的狀態。

+0

我認爲第一個例子顯示有兩個PNG實例,並且不被不同的類共享。第一例從未使用的事實對於這個問題並不重要。儘管顯示一些用法會更好。 –

+0

正如@LukeLee寫道的,我只是說第一個例子中兩個類有自己的MT實例。我可以寫一些類似mt.nextInt(10)的東西,但我沒有提出一個好例子。對於那個很抱歉。 – Nickel

相關問題