在java中的特定时间间隔内每次生成一个随机数
Generating a random number every time in a specific time interval in java
我有一个方法,可以在运行时绘制纹理。
我生成一个随机数,它会改变纹理的高度。
问题是,在运行时,正在创建所有可能的随机数,并且纹理以各种高度显示。
我生成一个随机数:
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();
}
您可以创建一个对象,该对象以您想要的间隔提供新的随机生成值,并将该对象指定为包含 drawTower
方法的 class 中的一个字段。请注意,此生成器对象需要正确同步,因为一个线程将访问随机生成的值,而另一个线程将更新它:
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
方法的class中(注意,对于这个例子,更新率设置为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
class 不是功能接口(因此不能用 lambda 表达式替换)。构造函数中的 valueUpdater.schedule
方法调用用于安排在所需时间段到期后更新随机数。
我有一个方法,可以在运行时绘制纹理。
我生成一个随机数,它会改变纹理的高度。
问题是,在运行时,正在创建所有可能的随机数,并且纹理以各种高度显示。
我生成一个随机数:
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();
}
您可以创建一个对象,该对象以您想要的间隔提供新的随机生成值,并将该对象指定为包含 drawTower
方法的 class 中的一个字段。请注意,此生成器对象需要正确同步,因为一个线程将访问随机生成的值,而另一个线程将更新它:
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
方法的class中(注意,对于这个例子,更新率设置为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
class 不是功能接口(因此不能用 lambda 表达式替换)。构造函数中的 valueUpdater.schedule
方法调用用于安排在所需时间段到期后更新随机数。