在多次使用具有给定种子的随机数生成器 (RNG) 时(即每次使用相同的种子调用 setSeed()
以重新开始),我在每次通过时生成的数字序列中遇到了一些偏差。在我的头撞墙几次后,我发现原因是这样的:box2d
的 World.createBody()
电话LongMap.put()
, 调用 LongMap.push()
, 调用 MathUtils.random()
里面while
环形。
据我所知,粒子效果请调用 MathUtils.random()
也。
那么如果 LibGDX 内部使用相同的静态 RNG 实例,我怎么能相信一个数字序列总是重复自己,因此可能会弄乱序列?
我该如何确切地知道何时何地 MathUtils.random()
在我的代码之外被调用?
最佳答案
正如@Peter R 所指出的,您可以创建自己的 RNG,以保证不会干扰数字序列。
可以使用 Java 的 Random:
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 供内部和外部使用,这使得将它与种子一起使用是不安全的,并且在评论中没有提到这一点。
但是上面的解决方法对于任何不像我这样小气的人来说应该是令人满意的。
关于random - LibGDX 内部调用 MathUtils.random() 干扰生成的随机数序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51013197/