java - TimerHandler 每秒使用受限随机生成器

标签 java android andengine

所以

我有一个每秒都会调用的方法来将 Sprite 添加到场景中。

我想要做的是能够控制调用该方法时添加 Sprite 的百分比。

所以我尝试使用

Math.Random() > .3; 

基本上,添加 Sprite 的几率为 30%...对吗?

所以问题是我只有四个 Sprite 。因此,有时当调用该方法时,不会将任何 Sprite 添加到场景中,而每次调用该方法时都会添加一个 Sprite 。

所以尝试使用

    Random rand = new Random();

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

if (itemNumber == 1) {

问题是这完全由随机生成器控制。当我希望能够控制添加更多或更少 Sprite 的百分比时。

那么我该怎么做呢?

最佳答案

首先,这个:

if(Math.Random() > .3)   

70% 的时间会通过,而不是 30%。如果你想要30%,改成<

编辑:

好的,那么您想确保调用 Sprite ,并希望能够控制调用每个特定 Sprite 的频率吗?您需要的是每个 Sprite 的一个变量,其中包含调用它的几率。例如,这将返回一个 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 的总和之间的数字如果你想要每回合都有一个 Sprite 。

更新2:

在您的绘图例程中,您可以调用上述函数来选择 Sprite 并进行相应的绘制:

...
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 放在数组中,那就更容易了:

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

这实际上完全取决于您的程序流程。您应该能够使这个概念适应您正在使用的任何例程。

关于java - TimerHandler 每秒使用受限随机生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11254014/

相关文章:

java - 带服务注入(inject)的 spring 链接构造函数

java - 如何在 android L 上加载 OpenCV 时删除日志记录语句

android - 如何在andengine for android中更改 Sprite 动画?

android - Andengine Sprites 排列并触摸了哪一个?

java - 从注释中删除页面引用

java - a4j :commandButton always executes form even when execute id's given

java - 多线程环境下的系统恢复

java - 将 Intent 分配给 ListView 中的字符串 - 在范围内无法访问 ListActivity 的封闭实例

android - 我的 native C++ Android 程序中缺少 glShaderModel 库

android - AndEngine播放器、背景和摄像头