0

重複の可能性:
シードを設定すると、Javaランダムは常に同じ番号を返しますか?

私のゲームでは、ランダムに生成された同じ座標に移動している4つのモンスターがいます。ランダムが機能していないことを意味します。

 public void run() {
    while (true) {

                    // paints all Sprites, and graphics
        updateScreen(getGraphics());

        try {
            Thread.sleep(sleep);

        } catch (Exception e) {
        }
    }
}


private void updateScreen(Graphics g) {

     loops through all monsters and moves them a bit
     for (int gi = 0; gi < bottX.length; gi++) {

      bot(gi); // moves a  specified monster or gets new coordinates
     }

}

private void bot(int c) {

// some stuff to move a monster



 // if a monster is in desired place, generate new coordinates

    if(isInPlace()){
       // g]randomly generates new coordinates X and Y
        botX(c);
    botY(c);

    }


 }



public void botX(int c) {

           // monsters walking coordinates are between 30 px from the spawn zone.
    Random r1 = new Random();
    int s = r1.nextInt(3);
    // number 0 - left 1 - right 2 - don`t go in X axis
            // monster spawn coordinate
    int botox = spawnnX[c];
    int einamx;


    if (s == 0) {

        einamx = r1.nextInt(30) + (botox - 30); 
                    // [botox-30; botox)
    } else if (s == 1) {
        einamx = r1.nextInt(29) + (botox + 1); // (botoX+1 botoX+30]
    } else {
        einamx = botox;
    }



            // sets to where the monster should go
    einammX[c] = einamx;
    return;




          }

したがって、このゲームでは、スポーン座標が等しい4つのモンスターがあり、同じように動いているため、1つのモンスターしか見ることができません。ところで、スポーン座標を変えると、同じように動いている4体のモンスターを見ることができます。

4

4 に答える 4

1

Java 1.4.2以前の古いバージョン、および場合によっては使用しているバージョンでは、ランダムはシードされていました。System.currentTimeMillis() これは、この呼び出しの解像度内で1〜16ミリ秒の間に複数のランダムを作成する場合、同じシード。

簡単な回避策は、作成Randomして再利用することです。これはより効率的であり、各呼び出しがランダムな値を与えることを保証します。

Java 5.0は、System.nanoTime()とAtomicLong counetrを使用してこれを修正し、シードが毎回異なることを確認しました。

于 2012-10-30T16:29:58.697 に答える
1

毎回新しいものを作成するのではなく、ランダムを1つ作成して再利用してみてください(複数のスレッドがある場合は、スレッドごとに1つ作成します)。

于 2012-10-30T16:30:25.593 に答える
1

おそらくシードの問題です。new Random(seed) コンストラクターを使用します。

おそらくあなたはそれを次のようなもので呼ぶことができます

new Random(System.currentTimeMillis());

ただし、同じミリ秒以内にこれを複数回呼び出すと、同じ問題が発生します。ただし、何度も電話する必要はないと思います。オブジェクトを再利用するだけです。

于 2012-10-30T16:30:31.077 に答える
1

Random 私はそれがうまくいくと強く思う!ここから

Randomの2つのインスタンスが同じシードで作成され、それぞれに対して同じシーケンスのメソッド呼び出しが行われる場合、それらは同じ番号のシーケンスを生成して返します。

同じミリ秒以内に作成された2つのランダムオブジェクトは、同じ乱数シーケンスを持ちます。

したがって、同じシードで複数のインスタンスを作成Randomしているのではないかと思います。そのため、毎回同じ乱数シーケンスを取得しています。

于 2012-10-30T16:28:38.967 に答える