2016-03-25 5 views
2

小さなアプリを作成しました(プロジェクトをリリースする予定はありません)。コードの一部が乱数のグリッドを生成し、この番号のリストからスプライトを使用してグリッドを表示します。それは少なくとも私のKindle Fire(と私が試した別のデバイス)では、期待通りに動作しました。エミュレータが自分のデバイスよりランダムでない理由は何ですか?

しかし、エミュレータは別の話です。私はエミュレートされたデバイスが一般的なサムスン(4、多分)だったと思う。同じコードをエミュレータで実行すると、グリッドの半分がスプライト1つで、半分がスプライトで塗りつぶされます。

グリッドはエミュレータ上で次のようになります。

11177 
11177 
11777 
11777 
11777 

の代わりに、実際のデバイス上でこの:

64251 
26253 
87635 
38415 
28167 

私のコードの関連部分(はい、私はnew Random()を移動する必要がありますが他の場所):

import java.util.Random; 

// ... ... ... 

for (int i = 0; i < GRID; i++) { 
     for (int j = 0; j < GRID; j++) { 
      paint.setColor(Color.parseColor("#FBB117")); 
      Random rand=new Random(); 
      int num=rand.nextInt(8); 
      canvas.drawBitmap(bmp,frames[num],calcGridSpot(i,j), 
        paint); 

//... Eventually closing braces: 
     } 
} 

I過去にJavaで、Randomがランダムではないと判断した問題がありました(私はそれが最適化のためかもしれないと考えています)。

エミュレータの動作がランダムではないのはなぜですか? (そしてどうすればいいですか?)

答えて

3

私はあなたの "はい、私はどこか別の場所に移動するべきです"と思っています。

Androidのjava.util.Randomクラスのソースを見つけることができます。 kitkatlollipop/marshmallowのバージョンが異なることに注意してください。

キットカット:

public Random() { 
    // Note: Using identityHashCode() to be hermetic wrt subclasses. 
    setSeed(System.currentTimeMillis() + System.identityHashCode(this)); 
} 

マシュマロ:

public Random() { 
    // Note: Don't use identityHashCode(this) since that causes the monitor to 
    // get inflated when we synchronize. 
    setSeed(System.nanoTime() + seedBase); 
    ++seedBase; 
} 

注ナノ秒の粒度までの時間をミリ秒粒度の時からの変化。ただし、この変更は、エミュレートされたデバイスに実際に細かいクロックがある場合にのみ関係します。いくつかのエミュレータは非常に粗いクロックを持つことがあります。つまり、System.nanoTime()は、適度に高速なループの繰り返しごとに同じ値を返すことがあります。

N、N + 1、N + 2などで新しい乱数ジェネレータを作成し、ループします。シードはほぼ同一であるため、最初の数値出力のほとんどのビットは同一です。

ループから「新しいランダム」を取り出すと、より効率的になるだけでなく、疑似乱数ジェネレータが完全なシーケンスを進めてより良い結果を得ることができます。

+0

Androidは_own_ java.util.Randomを宣言していますか? – Laurel

+0

@Laurelはジェネレータの実装ではなく、コンストラクタです。 – pjs

+0

"N"リリースのソースを保持している "master"ブランチは、非常に異なる実装をしています:https://android.googlesource.com/platform/libcore/+/master/ojluni/src/main/ java/java/util/Random.java – fadden

関連する問題