LibGDX 对 MathUtils.random() 的内部调用会干扰生成的随机数序列



在多次使用带有给定种子的随机数生成器 (RNG( 时(即每次使用相同的种子调用setSeed()重新开始(,我在每次传递时生成的数字序列中遇到了一些偏差。在用头撞了几次墙后,我发现原因是这样的:

box2dWorld.createBody()调用LongMap.put()LongMap.push()MathUtils.random()while循环中调用。

据我所知,粒子效应也叫MathUtils.random()

那么,如果 LibGDX 在内部使用相同的静态 RNG 实例,我怎么能相信一个数字序列总是重复自己,从而可能弄乱序列呢?

我应该如何确切地知道MathUtils.random()在我的代码之外何时何地被调用?

正如@Peter R所指出的,可以创建自己的RNG,保证不会干扰数字序列。

可以使用Java的随机

import java.util.Random;
private Random random = new Random();

或 MathUtils 使用的 RandomXS128(它扩展了 Java 的 Random,但速度更快(:

import com.badlogic.gdx.math.RandomXS128;
private Random random = new RandomXS128();

MathUtils中方便的包装方法(random((签名(也可以根据需要使用(复制到自己的类中(,无论是否静态。

/** Returns a random number between start (inclusive) and end (inclusive). */
public int random (int start, int end) {
return start + random.nextInt(end - start + 1);
}
/** Returns a random number between start (inclusive) and end (exclusive). */
public float random (float start, float end) {
return start + random.nextFloat() * (end - start);
}

就我自己而言,我仍然对为什么 MathUtils 提供了一个可以在内部和外部使用的共享 RNG 感到困惑,这使得将其与种子一起使用是不安全的,并且在评论中没有提到这一点。

但是上述解决方法对于任何不像我这样小气的人来说都应该令人满意。

最新更新