2014-09-30 6 views
0

Привет, когда я запускаю этот кусок кода и возвращаю ложное расстояние, новое случайное число не генерируется. Одно и то же случайное число непрерывно генерируется, тем самым превращая меня в бесконечный цикл. Кто-нибудь знает, почему это происходит? Спасибо, что посмотрели!Новое случайное число, не генерирующее

private void setRandomVerticies() 
{ 
    //generate 200 triangles 
    this.randomVerticies = new LinkedList<TGVertex>(); 
    random.setSeed(System.currentTimeMillis()); 
    short x = 5000, y = 5000; 
    int specT = 0; 
    int vert = 0; 
    int triangleCount = 0; 
    int rx = 0, ry = 0; 
    int sameAxis = 0; 
    TGVertex check = new TGVertex(x,y); 
    for (int i = 1; i <= 600; i++) 
    { 
     for (;;) 
     { 
     rx = random.nextInt(); 
     ry = random.nextInt(); 
     System.out.println("generate a new random number please"); 
     if(i == 1) break; 
     if (specT == 1) //approximately 50 triangles will have 2 vertices against the edge 
     { 
      if  (sameAxis == 0 || sameAxis == 1) { rx = 0; 
      }else if (sameAxis == 2 || sameAxis == 3) { ry = 0; 
      }else if (sameAxis == 4 || sameAxis == 5) { rx = tImage.getWidth()-1; 
      }else if (sameAxis == 6 || sameAxis == 7) { ry = tImage.getHeight()-1; } 
      check = new TGVertex(rx, ry); 
      if (!randomVerticies.contains(check)) 
      { 
      if (vert == 2 && distance(check, randomVerticies.get(i-2))) 
      { 
       sameAxis++; 
       if (sameAxis == 8) sameAxis = 0; 
       break; //breaks while loop if new vertex is chosen 
      } 
      else if (vert == 1) 
      { 
       sameAxis++; 
       if (sameAxis == 8) sameAxis = 0; 
       break; //breaks while loop if new vertex is chosen  
      } 
      } 
     } 
     rx = (short)(rx & 0x1FF); 
     ry = (short)(rx & 0x19D); 
     check = new TGVertex(rx, ry); 
     System.out.println("rx = " + rx + " ry = " + ry); 
     System.out.println("check = " + check.getX() + ", " + check.getY()); 
     System.out.println("randomVert = " + randomVerticies.get(i-2).getX() + ", " + randomVerticies.get(i-2).getY()); 
     if (!randomVerticies.contains(check) && distance(check, randomVerticies.get(i-2))) break; //breaks while loop if new vertex is chosen 
     } 

     String sliceX = Integer.toHexString(this.width()-1); 
     String sliceY = Integer.toHexString(this.height()-1); 
     int sX = (int) Integer.parseInt(sliceX, util.Global.HEX); 
     int sY = (int) Integer.parseInt(sliceY, util.Global.HEX); 
     x = (short) (rx & sX); 
     y = (short) (ry & sY); 
     //System.out.println("("+x+", "+y+")"); 
     randomVerticies.add(new TGVertex(x, y)); 

     if (i % 3 == 0) triangleCount++; 
     if (triangleCount == 2 && vert < 3) 
     { 
     specT = 1; 
     vert++; 
     } 
     if (vert == 3) 
     { 
     specT = 0; 
     vert = 0; 
     triangleCount = 0; 
     } 
    } 
} 

Вот результат, так как вы можете видеть, что randomVert никогда не меняет значения.

rx = 196 ry = 132 
check = 196, 132 
randomVert = 225, 392 
generate a new random number please 
rx = 383 ry = 285 
check = 383, 285 
randomVert = 225, 392 
generate a new random number please 
rx = 328 ry = 264 
check = 328, 264 
randomVert = 225, 392 
generate a new random number please 
rx = 102 ry = 4 
check = 102, 4 
randomVert = 225, 392 
generate a new random number please 
rx = 197 ry = 133 
check = 197, 133 
randomVert = 225, 392 
generate a new random number please 
rx = 62 ry = 28 
check = 62, 28 
randomVert = 225, 392 
generate a new random number please 
rx = 295 ry = 261 
check = 295, 261 
randomVert = 225, 392 
generate a new random number please 
rx = 142 ry = 140 
check = 142, 140 
randomVert = 225, 392 
generate a new random number please 
rx = 261 ry = 261 
check = 261, 261 
randomVert = 225, 392 
+0

Это один из самых сложных фрагментов кода, который я когда-либо видел. Вау! – Adam

+0

Скомпилирует? в строке 5 вы вызываете random.setSeed(), но не объявляется до 13 ... Я бы не использовал миллисекундный посев, поскольку Random уже засеял nano seconds и уникальную соль экземпляра. – Adam

+0

Это компилируется, извините за путаницу с дополнительным случайным вызовом. Он был удален и обновлен в редакции. – vector

ответ

1

Вы создаете спина к спине новые экземпляры Random в цикле. Просто создайте один (вне цикла!) И задайте ему случайные числа, когда вам понадобятся новые значения. Подумайте об этом, как о том, как копать колодец - вы не копаете новый колодец каждый раз, когда вы хотите выпить воды, вы копаете один колодец и возвращаетесь к нему на столько напитков, сколько вам нужно.

+0

Привет, я принял ваш совет и отредактировал код, как вы теперь видите выше; однако, я все еще испытываю ту же проблему, что и раньше. Спасибо! – vector

+0

Вы прошли через отладчик или добавили инструкции печати, чтобы подтвердить, что проблема связана со случайными номерами? Кроме того, считается неправильной формой для редактирования кода в вашем вопросе - внесите дополнение с любыми изменениями, но вы должны оставить неповрежденный исходный код. – pjs

+0

Да, я добавлю вывод к вопросу. – vector