2012-03-13 17 views
2

Javaのランダムな方向にオブジェクトを移動するためのコードを書きました。 2つの機能があります。Javaの乱数に関する問題

  1. FindRandomDirectionは - 8つの可能な方向(方向はテンキーの数字1,2,3,4,6,7,8,9で表される)からランダムな方向を取得します。オブジェクトがいずれかの境界の近くにあるかどうかを確認するためのチェックが行われます。そうであれば、オブジェクトは境界線から離れた方向に移動します。

  2. MoveObject - オブジェクトの(X、Y)座標を一定のSTEPで移動して変更します。

しかし、これまでにX、Yの値は何ですか?数回(700以上)プロセスを繰り返した後、X、Yの値は{X:20-50}、{Y:450-465}になります。

I.e.

Case 1: (x:35,y:65) becomes (x:35, y:465) 
Case 2: (x:30, y:455) becomes (x:30, y:460) 
Case 3: (x:435, y:65) becomes (x:25, y:460) 
Case 4: (x:430, y:465) becomes (x:40, y:460) 

私は数回繰り返した後のx、yのポイントは私がランダムに数字を生成するにもかかわらず、これらの値に向かって収束する理由にしたいと思います。

以下は同じコードです。

import java.io.*; 
public class bug 
{ 
    //public static int x = 35; 
    //public static int y = 60; 

    //public static int x = 35; 
    //public static int y = 460; 

    //public static int x = 435; 
    //public static int y = 60; 

    public static int x = 435; 
    public static int y = 460; 

    public static final int NORTH = 8; 
    public static final int EAST = 6; 
    public static final int WEST = 4; 
    public static final int SOUTH = 2; 
    public static final int NORTHEAST = 9; 
    public static final int NORTHWEST = 7; 
    public static final int SOUTHWEST = 1; 
    public static final int SOUTHEAST = 3; 
    public static final int STEP = 5; 

    //Function to move the object in a specified direction. 
    public static void moveObject(int direction) 
    { 
      double nX = 0, nY=0; 
      switch(direction) 
      { 
      case NORTH: 
       nY = y- STEP; 
       nX = x; 
       break; 
      case SOUTH: 
       nY = y+ STEP; 
       nX = x; 
       break; 
      case EAST:    
       nY = y; 
       nX = x + STEP; 
       break; 
      case WEST: 
       nY = y; 
       nX = x- STEP;    
       break; 
      case NORTHEAST: 
       nX = x + STEP; 
       nY = y- STEP; 
       break; 
      case NORTHWEST: 
       nX = x- STEP; 
       nY = y- STEP; 
       break; 
      case SOUTHEAST: 
       nX = x + STEP; 
       nY = y+ STEP; 
       break; 
      case SOUTHWEST: 
       nX = x- STEP; 
       nY = y+ STEP; 
       break; 
      } 
      x = (int) nX; 
      y = (int) nY; 
      System.out.println("Direction: "+direction+"; X: "+x+"; Y: "+y); 
     } 
//Function to move the object in a random direction 
//Also if wall(Border) is present the object should move in proper direction 
    public static int findRandomDirection(int objObjectX, int objObjectY) 
    { 
     int[] move = {1,2,3,4,0,6,7,8,9}; 
     int randDir=0; 
     //Generate a random direction to move. Generate new direction if the objected can not be moved in a direction 
     do 
     { 
      java.util.Random randomGenerator = new java.util.Random(); 
      randDir = randomGenerator.nextInt(8); 

      //If the object lies near East Border, it can not move in that direction 
      if(objObjectX <= 25) 
      { 
       move[0] = 0; 
       move[3] = 0; 
       move[6] = 0; 
      } 

      //If the object lies near West Border, it can not move in that direction 
      if(objObjectX >= 465) 
      { 
       move[2] = 0; 
       move[5] = 0; 
       move[8] = 0;     
      } 

      //If the object lies near North Border, it can not move in that direction 
      if(objObjectY <= 25) 
      { 
       move[6] = 0; 
       move[7] = 0; 
       move[8] = 0; 
      } 

      //If the object lies near South Border, it can not move in that direction 
      if(objObjectY >= 465) 
      { 
       move[0] = 0; 
       move[1] = 0; 
       move[2] = 0;     
      } 
     } while(move[randDir]==0); 
     return move[randDir];  
    } 
    public static void main(String[] args) 
    { 
     for(int i = 0; i<1000;i++) 
     { 
     int dir=findRandomDirection(x,y); 
     moveObject(dir); 
     } 
    } 
} 

時間の経過とともに、オブジェクトはボードの左下隅に移動します。バグを見つけてくれて助けてください。

+3

ループ内で擬似乱数ジェネレータを再初期化しないでください。クラスに対して一度だけオブジェクトを作成し、それを再利用します。 'java.util.Random'にはこのミスを処理するコードが含まれていますが、悪い習慣を拾わない方が良いです。 – Joey

答えて

6

nextInt(8)を使用しているため、返される値は常に0〜7(両端を含む)になります。 8は返されないので、動きは反対方向に偏っています。 0から8までの値を返すには、おそらくnextInt(9)を使用します。

編集:明確にするために、「8」は、あなたのランダムな方向として選ばれていない、とmoves[8]==9決してされているので、オブジェクトが時間をかけて、それがSOUTHWESTを移動する傾向があることを意味しますNORTHEAST方向に動くことはありません。

また、上記の@Joeyと同じように、毎回Randomオブジェクトを再初期化するべきではありませんが、それはドリフト動作の原因とはなりません。

+0

この質問は45分間違いなくここに置いてあります(私は知っている、私はそれを把握しようとしていた)、あなたの答えは、ほぼ同じ2つを引き付けるために管理します:) – ggrigery

3

方向を選択すると、0と7の間の値を選択します。 (あなたのマッピングで)これらの値は、に対応しています。

public static final int SOUTHWEST = 1; 
public static final int SOUTH = 2; 
public static final int SOUTHEAST = 3; 
public static final int WEST = 4; 
public static final int EAST = 6; 
public static final int NORTHWEST = 7; 
public static final int NORTH = 8; 

しかし、これはが選択されることはありませんのでご注意:

public static final int NORTHEAST = 9; 

だから、それはあなたのコードは、南東部に偏っているように見えることを私には驚くことではありません...

1

nextInt(n)メソッドは、0から0を含む数字をn,に返します。値8を渡すので、結果は0の値のセット0 – 7からです。したがって、北東方向を表す配列の9番目の要素は決して選択されません。

北東への偏りは、最終的に南西に移動します。

関連する問題