2016-10-18 9 views
0

私はここから得ることができるメルセンヌツイスターを使用する予定です:https://cs.gmu.edu/~sean/research/、しかし私はそれを使用する方法が不思議です。私は二つのおもちゃの例を作ったあなたはどちらが良いと思いますか?あなたの選択には明確な理由はありますか?Mersenne TwisterをJavaでどのように使用できますか?

私がしたいことは、高品質の疑似乱数を作り、再現性を確認することです。

例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の(異なるクラスが1つのメルセンヌ・ツイスタのインスタンスを共有する)

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

ウェブページの指示によると、クラスMersenneTwisterはスレッドセーフですが、MTクラスが共有されているマルチスレッドプログラムは反復可能ではないかもしれません – Nickel

+0

これは、mt.randInt(10)が同じ順序で呼び出されないためです毎回。 – Nickel

答えて

0

それは誰もがする時間を取るために起こっているとは考えにくいのです(各クラスは、独自のメルセンヌ・ツイスタのインスタンスを持っています)そのリンクの内容を分析する。

それに関係なく、私は例1を好きではありません。あなたのメインメソッドのmtは完全に使用されていません。

MersenneTwister mt = new MersenneTwister(1); 

コードのその行が違いはありません...

new MersenneTwister(1); 

...、コードのその行は、ヒープには(見かけ上)CPUサイクルを無駄にする以外の目的、空間を提供していません例外をスローする可能性があります。

一方、第2の例では、Barの動作の柔軟性が向上しています。これは、新しいBarインスタンスの状態を指定することによって実現します。Barはいくつかの魔法の状態で初期化されています。

+0

最初の例は、PNGの2つのインスタンスがあり、異なるクラスによって共有されていないことを示していると思います。最初のインスタンスが決して使用されないという事実は、その質問にとって本当に重要ではありません。いくつかの使い方を示す方が良いでしょう。 –

+0

@LukeLeeが書いているように、最初の例では、2つのクラスに独自のMTインスタンスがあることを意味しています。 mt.nextInt(10)のようなものを書くことができましたが、良い例はありませんでした。申し訳ありません。 – Nickel

関連する問題