随机功能不能按我的意愿工作

时间:2012-02-13 08:02:05

标签: java

我试图制作一个吃豆子,所以即时通讯使用阵列[8] [8],其中我有一个吃豆人,2个鬼,墙壁和吃豆子可以吃的点。当pacman吃点时你会开始得到空的空间。

所以我决定制作一个随机的函数,只将ramdonly分配给空的空间,但问题是,随着更多空的空间,你得到的果实开始变得疯狂,并出现在我的阵列中。尽管我有空的空间,我仍然希望获得水果的机会相同。

以下是我正在使用的方法,请帮忙。

 public void AppearFruit()
{
    for(int i= 0; i<_world.length; i++){
        for(int j= 0; j<_world.length; j++){
            Random as = new Random(); 
            int fru = as.nextInt(20); 
            if(fru==10){
                if(_world[i][j] instanceof Empty){
                    _world[i][j] = new Fruit(i,j);  
                }  
            }           
        }
    }
}

public void DisappearFruit()
{

    for(int i= 0; i<_world.length; i++){
        for(int j= 0; j<_world.length; j++){
            if (_world[i][j] instanceof Fruit){
                if(contfru>=3) {
                    _mundo[i][j] = new Empty(i,j);
                    contfru=0;
                }
            }
        }
    }
}

3 个答案:

答案 0 :(得分:1)

这取决于“获得水果的机会”的含义。

你现在所拥有的东西将独立地给每个空的空间一个20%的机会获得一个水果。因此,如果你有一个2-300个空格的大网格,那么每次AppearFruit运行时你都会得到10-15个水果。

我不知道contfru中的DisappearFruit变量是什么,但我认为它并没有摆脱接近这个速度的水果 - 所以随着时间的推移,越来越多的水果会出现。

修改:更新后,您要求

  尽管我有空的空间,但获得水果的机会相同

根据定义,这意味着您当前的方法根本无法工作,因为您为每个空间提供了获得成果的平等机会。将空格的数量加倍会使得到的水果数量翻倍(平均而言)。

听起来你想要一种更像是添加一个水果的方法,它会扫描空白数组并随机将水果分配给其中一个空格。然后你可以调整你调用这种方法的频率 - 也许它恰好每50个回合发生一次,可能每30 + rnd(40)次转动,也许每60秒发生一次,等等。你可以调整出现多少水果(以及多快)通话的频率。

答案 1 :(得分:0)

好的,我想我明白为什么你会得到很多成果。在您的方法AppearFruit中,当您指定一个Fruit时,您不会增加countfru,使您方法DisappearFruit永远不会像预期的那样工作

答案 2 :(得分:0)

现在,每个空白字段出现水果的概率为5%,每次移动 。就像你有一个空字段并将pacman移动10次一样, this 字段的概率是

 P_fruit = 1 - (19/20)^10
         = 40.1% 

我猜,算法并不差,你可以经常把它称之为。

修改

你可以通过使用一个低得多的概率来调整行为,但最后,它会是相同的:如果你需要更多水果,只需保持pacman移动。

我将水果生成与运动脱节。想想一个计时器 - 就像每隔30秒触发一个事件,在空的空间上以低概率产生果实。你甚至可以说:我定义了一个概率 p ,在电路板上生成一个水果然后随机选择一个当前空白空间: (伪代码)

 placeFruit(board)
    if (random() > 5%) return;   // no fruit this time
    List fields :== getAllEmptyFields(board);
    fruitField :== random(fields.size());
    fruitField.add(new Fruit());