时间处理器每秒都有收缩的随机生成器

时间:2012-06-28 22:51:35

标签: java android andengine

所以

我有一个方法可以每秒调用一次,以便为场景添加精灵。

我想要做的是能够控制调用方法时添加精灵的百分率。

所以我尝试使用

Math.Random() > .3; 

基本上这将是精灵加入的30%几率......正确吗?

所以这个问题是我只有四个精灵。因此,有时当调用方法时,不会向场景中添加精灵,每次调用该方法时都会添加一个精灵。

所以尝试使用

    Random rand = new Random();

int itemNumber = rand.nextInt(4) + 1;

if (itemNumber == 1) {

这个问题是由Random发生器完全控制的。当我希望能够控制或多或少添加精灵的百分比时。

那么我的做法是什么?

2 个答案:

答案 0 :(得分:1)

首先,这个:

if(Math.Random() > .3)   

将通过70%的时间,而不是30%。如果您想要30%,请将其更改为<

修改

好的,所以你想确保调用一个精灵,并希望能够控制每个特定精灵的调用频率?你需要的是每个精灵的一个变量,它包含调用它的几率。例如,这将返回一个int来表示每个sprite:

final double[] mOdds = {0.10, 0.25, 0.30, 0.35};   
// note, mOdds totals 1.0

public int pickSprite()
{
    double rand = Math.Random();
    for(int i=0;i<mOdds.length;i++)
    {
        if(rand < mOdds[i])
            return i;
        rand -= mOdds[i];
    }
    return -1;                    // should never reach this
}

您可以在mOdds中使用不添加到1.0的任意数字,但您必须稍微修改一下。基本上,如果你想要每一轮都有一个精灵,你只需要确保rand会给你一个0到所有mOdds总数的数字。

更新2:

在绘图程序中,您可以调用上面的函数来选择精灵并相应地绘制:

...
switch(pickSprite())
{
case 0:
    // draw sprite 0
    break;
case 1:
    // draw sprite 1
    break;
case 2:
    // draw sprite 2
    break;
case 3:
    // draw sprite 3
    break;
}
...

或者,如果你在数组中有精灵,那就更容易了:

...
sprite[pickSprite()].draw(); // substitute however you draw
...

这一切都取决于你的程序流程,真的。你应该能够将这个概念适应你正在使用的任何例程。

答案 1 :(得分:0)

如果我理解正确的话。您需要生成1-4之间的随机数(包括1和4)。

此代码必须为您提供1-4之间的随机数(包括1和4)。

Math.ceil(Math.random()*4);