Java随机数失败如果For循环

时间:2016-03-09 20:53:23

标签: java if-statement for-loop random

我已经建立了一个简单的程序,用一些随机元素在一个框架内绘制城市天际线。建筑物的数量将是[5-9]之间的随机数,每个建筑物的宽度和高度也是随机的(在给定范围内),每个建筑物之间的间隙也是如此。当我尝试根据建筑物数量选择不同的间隙范围时,我遇到了问题。以下是相关代码部分(我已导入java.util。*;):

Random gen = new Random();
int buildNum = gen.nextInt(5) + 5; //generate random number [5 - 9]

for (int i = 0; i < buildNum; i++) 
    {
        //generate random width
        buildWidth = gen.nextInt(26) + 35; //[35 - 60]

        //generate random height
        buildHeight = gen.nextInt(201) + 200; //[200 - 400]

        //instantiate building
        building = new Building (gap, 500 - buildHeight, buildWidth, buildHeight, Color.gray);
        buildingsArray.add(building);

        //draw building
        buildingsArray.get(i).draw (page);

        //generate random gap between building
        if (buildNum < 7) 
        {
            gap += buildWidth + gen.nextInt(16) + 40;
        }

        if (buildNum == 7) 
        {
            gap += buildWidth + gen.nextInt(9) + 15;
        }

        if (buildNum > 7) 
        {
            gap += buildWidth + gen.nextInt(9) + 8;
        }
    }

使用随机数初始化buildNum变量,然后使用该数字进行迭代。问题是,当我检查底部的三个ifs中的buildNum变量时,输出似乎与我期望的不一致。我将获得5个间隙非常小的建筑物(好像它通过了buildNum&gt; 7测试),或者我会得到7个建筑物,前六个正常,但在第七个建筑物之前有一个很小的间隙。我确定这是一件非常简单的事情,我忽略了,但我已经开始了几个小时并尝试了很多不同的事情(包括测试buildNum固定值5,6,7,8或9如果是,则使用else子句而不是第三个。)最后,我希望程序选择5到9之间的多个建筑物,然后相应地缩放间隙。我尝试在buildNum和buildWidth中进行分解,但是我无法让它工作并为此解决。如果有人有更好的方法或能够解决我的问题,我将非常感激!

更新:我已经使用恒定数量的建筑进行了测试,以了解输出范围是什么样的。问题在于,由于if(buildNum&lt; 7)条件,我预计5或6栋建筑物会有较大的间隙,并且由于其他2个条件而逐渐变小。相反,我最终得到了5个建筑物,这些建筑物的间隙非常小(6栋建筑物很好),7个和8个建筑物离开了页面(尽管我已经完成了数学计算,并且在if条件下添加了差距不允许这样)。这里有一些有用的评论,回答你的问题:是的,差距是左边的绝对位置。初始化一个小间隙,使第一个建筑物不接触框架的左侧。然后,一次一个地实例化建筑物,从那些if语句中选择间隙大小。根据包括所有先前间隙和所有先前建筑物宽度的复合间隙变量确定下一建筑物左侧的位置。我特别好奇李的评论if(buildNum == 7)和(buildNum&gt; 7)条款可能永远不会发生。你能解释一下吗?那不是8或9满足&gt; 7条件而7是否满足== 7条件?如果没有,我该怎么做才能改变它?另外,这是我的构造函数:

/**
* Constructor: sets background color and frame size
*/

public SkylinePanel()
{
    setPreferredSize (new Dimension(600, 500));
    setBackground (Color.black);
}

没有多少,真正的工作(包括上面显示的循环)是在paintComponent中,并且我已经显示了与建筑物间隙相关的所有内容。这是绘制方法(它在我的建筑类中):

/**
* Draws a building or window with the specified parameters
*/

public void draw (Graphics page) 
{
    page.setColor (color);
    page.fillRect (x, y, width, height);

    winNum = gen.nextInt(8) + 2;

    //generate a random number [2 - 9] of windows to draw on a given building
    for (int i = 0; i < winNum; i++) 
    {
        page.setColor (Color.yellow);
        page.fillRect (gen.nextInt(width - WIN_X) + x, gen.nextInt(height - WIN_Y) + y, WIN_X, WIN_Y);
    }
}

忽略关于Windows的代码,这很好用。我补充说,在我决定暂时解决差距问题之后。

哦,以防万一有人需要看到它,这里是Building类的构造函数:

public Building (int upperX, int upperY, int buildWidth, int buildHeight, Color shade) 
{
    x = upperX;
    y = upperY;
    width = buildWidth;
    height = buildHeight;
    color = shade;
}

非常感谢任何其他想法或问题!

0 个答案:

没有答案