2012-03-14 6 views
1

Math.random()はいつシードされますか?文書によると

このメソッドが最初に呼び出されると、それはこの新しい擬似乱数ジェネレータは正確に表現

new java.util.Random 

ことであるかのように、単一の新しい擬似乱数ジェネレータを作成しますその後このメソッドへのすべての呼び出しで使用され、他の場所では使用されません。

は、私が「このメソッドが最初に呼び出されたときに」の範囲に関して混乱している - それは私のアプリケーションを最初に呼び出したときにだけ、これまで一度に関係なく、自分のアプリケーションが

何を接種していないですか??を

答えて

0

あなたのJVMで(どのコードでも)最初に呼び出されたとき。

それは(安全ではない - 下のリンクを参照)やっているsingletonlazy initialization:このコードスレッドセーフではないことを

private static synchronized void initRNG() { 
    if (randomNumberGenerator == null) 
     randomNumberGenerator = new Random(); 
} 

EDIT注:呼び出すことによって

private static Random randomNumberGenerator; 

を。公式バグ:http://bugs.sun.com/view_bug.do?bug_id=6470700

+0

-1このコードはスレッドセーフではありません。 http://en.wikipedia.org/wiki/Double-checked_locking –

+0

Noobの質問ですが、最初の文章で、他のアプリケーションが同じJVMを使用していることを説明することはできますか? – Flash

+0

@Andrew:Tomcat、JBoss、WebSphereなどのアプリケーション/ Webアプリケーションサーバーでは、複数のアプリケーションを同じVMにインストールできます。 –

0

ソースコードを見ると、Math.random()ための適切なコードは次のように定義される。それは呼び出しによって(Math.random()の最初の呼び出し)初期化されるとrandomNumberGeneratorが、static可変であるように、そう

private static Random randomNumberGenerator; 

private static synchronized void initRNG() { 
    if (randomNumberGenerator == null) 
     randomNumberGenerator = new Random(); 
} 

public static double random() { 
    if (randomNumberGenerator == null) initRNG(); 
    return randomNumberGenerator.nextDouble(); 
} 

はJVM内のどのクラスでも、そのクラスはそこにとどまります(クラスがもはや必要なくなり、アンロードされない限り)。

2

メソッドMath.random()が初めて呼び出されたときに初期化されます。

興味深いことに、Java 5および6では、コードはbroken double-checked-locking patternを使用しているため、ではなく、のように見えますが、スレッドセーフです。

[EDIT]正しいコードは次のようになります。

private static volatile Random randomNumberGenerator; // broken without volatile 

または代わりが、より高価な:

public static synchronized double random() { 
    ... 
} 

[EDIT2]公式バグ:Math.random()/Math.initRNG() uses "double checked locking"

+1

@ SanjayT.Sharma:両方のステートメントが正しくありません。 synchronizedブロックは、インスタンスが完全に初期化される前に参照がnull以外になることを防ぎません(したがって、次の呼び出しは半分のインスタンスを受け取ることができます)。また、Joshua Blochによれば、Javaチェックでは、このようなことを知っておく必要があります。 –

+1

詳細はhttp://en.wikipedia.org/wiki/Double-checked_lockingを参照してください。 'randomNumberGenerator'が' volatile'(これはJava 5での修正です)の場合にはうまくいくでしょう –

+0

私の悪い、混乱したことがあります。+1 –

関連する問題