我的随机漫游算法出了什么问题?

Rel*_*ual 0 java algorithm path

我为我用Java创建的游戏世界创建了一个二维"网格".我遇到了我创建的'漫游'模式算法的问题.

我注意到一个问题,对象似乎偏向网格的右下角.我更改了算法并认为它已修复.

今天,在压力测试的同时,我注意到问题并没有解决,现在游荡的物体偏向网格的左上角,但是它们需要更长的时间才能在那个区域内游荡.

该算法的工作原理是:1.获取人员位置的当前值2.将所有正方形的3个块半径放入链表3.随机化列表4.从列表中选择一个随机值5.将这些值设置为下一个目标

这是一段代码片段:

 Point personAt = this.getTopLeftPoint();
    personAt = Game.getGame().screenToGame(personAt);
    LinkedList<Point> thisSet = new LinkedList<Point>();
    for (int x = personAt.x - 2; x < personAt.x + 3; x++) {
    for (int y = personAt.y - 2; y < personAt.y + 3; y++) {
        if (!(x == personAt.x && y == personAt.y)) {
        //TODO: Clean up the next line of code.
        if (x > 0 && y > 0 && !Board.getBoard().getSquare(x, y).getSquareType().equals(SquareType.path)) {
            if (!Game.getGame().getMap().blocked(x, y)) {
            thisSet.add(new Point(x, y));
            }
        }
        }
    }
    }
    Collections.shuffle(thisSet);
    //Random random = new Random();
    //Integer randomNo = random.nextInt(thisSet.size());
    setNextTarget(thisSet.get(0));
Run Code Online (Sandbox Code Playgroud)

这里有什么我想念的吗?

我很困惑为什么他们仍然在网格的左上角四分之一.

编辑:我完全删除了随机对象,如唐所示.仍然以相同的结果结束.

编辑:更新了代码来修复问题的一部分,所以现在只忽略当前人所在的方格,而不是当前X或Y上的所有方格.正如rsp所建议的那样.

Jon*_*eet 8

几点,其中一些已经在其他答案中做出:

  • 和以前一样,只创建一个实例Random().我怀疑这将是答案的一部分-几个关于堆栈溢出的随机数非常问题没有做这个:)
  • 你为什么要洗牌采取随机元素?只需选择一个随机元素.
  • 一个不对称点:你正在检查x> 0和y> 0(顺便说一下,不是> = 0?)但是你没有检查x和y是否在电路板的上限范围内.如果Board.getSquare()应对,你真的需要> 0检查吗?


Ste*_*all 6

只初始化一次.你通过反复重新实例化随机生成器来破坏随机性.

优选地,使用工厂用于整个应用程序以创建随机单例.

public class RandomFactory
{
    private Random random;
    public Random getRandom()
    {
       if( random == null ){ random = new Random(); }

       return random;
    }
}
Run Code Online (Sandbox Code Playgroud)