【问题标题】:Generating a random number every time in a specific time interval in java在java中的特定时间间隔内每次生成一个随机数
【发布时间】:2019-05-31 05:58:46
【问题描述】:

我有一个在运行时绘制纹理的方法。

我生成一个随机数,它会改变纹理的高度。

问题是,在运行期间,所有可能的随机数都被创建,并且纹理以各种高度显示。

我生成一个随机数:

Random r = new Random();
int low = 0;
int high = 30;
int result1 = r.nextInt(high-low) + low;

这是我的drawTower() 方法:

private void drawTower() {

    batcher.draw(AssetLoader.texture1, tower1.getX(), tower1.getY() + tower1.getHeight() - result1, 
           tower1.getWidth(), midPointY - (tower1.getHeight()));    
}

可以看到有result1,就是随机生成的数字。

现在问题:在我的方法render() 中,我使用drawTower() 方法,这就是创建所有可能的随机数的原因。

我该如何解决这个问题?我想生成一个随机数,在特定的时间间隔后,正在生成一个新的随机数。但我不知道它是如何完成的。

public void render(float runTime) {

    Wizard wizard = myWorld.getWizard();

    // Fill the entire screen with black, to prevent potential flickering.
    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    // Begin ShapeRenderer
    shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);

    // Draw Background color
    shapeRenderer.setColor(55 / 255.0f, 80 / 255.0f, 100 / 255.0f, 1);
    shapeRenderer.rect(0, 0, 136, midPointY + 66);

    // End ShapeRenderer
    shapeRenderer.end();

    // Begin SpriteBatch
    batcher.begin();      
    batcher.enableBlending(); 

    batcher.draw(AssetLoader.texture0,
            wizard.getX(), wizard.getY(), wizard.getWidth(), wizard.getHeight());

    // Draw Tower
    drawTower();

    // End SpriteBatch
    batcher.end();

}

【问题讨论】:

  • 您需要随机高度一次(每个应用程序)还是在给定时间段后?

标签: java random libgdx runtime textures


【解决方案1】:

您可以创建一个对象,该对象以所需的时间间隔提供一个新的随机生成值,并将该对象分配为包含drawTower 方法的类中的一个字段。请注意,此生成器对象需要正确同步,因为一个线程将访问随机生成的值,而另一个线程将对其进行更新:

public class TimedRandomNumberGenerator {

    private final AtomicInteger value = new AtomicInteger();
    private final Timer valueUpdater;

    public TimedRandomNumberGenerator(long updateRateInMs) {
        valueUpdater = new Timer();
        valueUpdater.schedule(createTimerTask(), 0, updateRateInMs);
    }

    private TimerTask createTimerTask() {
        return new TimerTask() {
            public void run() {
                value.set(generateNewValue());
            }
        };
    }

    private static int generateNewValue() {
        Random r = new Random();
        int low = 0;
        int high = 30;
        return r.nextInt(high-low) + low;
    }

    public int getValue() {
        return value.intValue();
    }
}

在包含drawTower 方法的类中(请注意,对于本示例,它设置为1000 毫秒的更新速率,但可以更改为您想要的任何时间段):

public class SomeClass {

    private final TimedRandomNumberGenerator generator = new TimedRandomNumberGenerator(1000);

    private void drawTower() {
        batcher.draw(
            AssetLoader.texture1,
            tower1.getX(), 
            tower1.getY() + tower1.getHeight() - generator.getValue(),
            tower1.getWidth(), midPointY - (tower1.getHeight())
        );    
    }
}

TimedRandomNumberGenerator 的同步性在 AtomicInteger 的使用中被捕获。这可以保护随机生成的值免受多个读取器和多个写入器(在这种情况下为一个写入器:TimedRandomNumberGenerator 本身)的影响。 createTimerTask 方法只是一种方便的方法,因为 TimerTask 类不是函数式接口(因此不能用 lambda 表达式替换)。构造函数中的valueUpdater.schedule 方法调用会安排在所需时间段到期后更新随机数。

【讨论】:

  • 哇,好专业的回答!非常感谢。在我拼命寻找解决方案几个小时后,你让我笑了!
  • @JavaTeachMe2018 很高兴为您提供帮助
猜你喜欢
  • 2016-08-14
  • 1970-01-01
  • 2014-06-12
  • 1970-01-01
  • 1970-01-01
  • 2017-06-25
  • 1970-01-01
  • 2018-10-11
  • 1970-01-01
相关资源
最近更新 更多