【问题标题】:New Random Number Not Generating未生成新的随机数
【发布时间】:2014-09-30 05:10:44
【问题描述】:

您好,当我运行这段代码并返回错误距离时,不会生成新的随机数。不断产生相同的随机数,从而使我陷入无限循环。有谁知道为什么会这样?感谢您的关注!

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

【问题讨论】:

  • 这是我见过的最复杂的代码之一。哇!
  • 这可以编译吗?在第 5 行,您调用 random.setSeed(),但直到 13 点才声明...我不会使用毫秒播种作为随机已经播种的纳秒和唯一实例盐。
  • 这个编译,很抱歉与额外的随机调用混淆。它已在编辑中被删除和更新。
  • TGVertex 是否实现 equals() ?
  • 可以实现equals()。

标签: java random


【解决方案1】:

您正在循环中创建Random 的背靠背新实例。只需创建一个(在循环之外!),并在需要新值时向它询问随机数。可以把它想象成挖一口井——不是每次想喝水时都挖一口新井,而是挖一口井,然后再回到那里喝多少就喝多少。

【讨论】:

  • 嗨 pjs,我接受了您的建议并编辑了代码,正如您现在可以在上面看到的那样;但是,我仍然遇到与以前相同的问题。谢谢!
  • 您是否通过调试器或添加了打印语句来确认问题出在随机数上?此外,在您的问题中编辑代码被认为是错误的形式 - 对任何修订进行附录,但您应该保持原始代码不变。
  • 是的,我会将输出添加到问题中。
  • 我特意说的是rxry 在你生成它们之后的值。如果它们实际上是随机的,那么您已经消除了它作为问题的根源。
  • 输出已添加。
猜你喜欢
  • 2015-03-24
  • 1970-01-01
  • 2020-06-07
  • 1970-01-01
  • 1970-01-01
  • 2023-01-03
  • 1970-01-01
  • 2011-10-24
  • 2020-11-29
相关资源
最近更新 更多