当使用随机数发生器(RNG)与给定的种子多次(即。每次用相同的种子调用setSeed()以重新开始),我在每次传递时生成的数字序列中都会遇到一些偏差。在我的头撞了几次墙后,我找到了这样的理由:
box2d的World.createBody()调用LongMap.put(),后者调用LongMap.push(),后者在while循环中调用MathUtils.random()。
据我所知,粒子效应也叫MathUtils.random()。
那么,如果LibGDX内部使用相同的静态RNG实例,并因此可能会搞乱序列,那么我怎么能相信一个数字序列总是重复自己呢?
我如何知道MathUtils.random()在代码之外的确切位置和何时被调用?
发布于 2018-06-26 11:00:06
正如@Peter所指出的,一个人可以创建自己的RNG,这保证没有任何东西会干扰数字序列。
可以使用Java的“随机”:
import java.util.Random;
private Random random = new Random();或者是由RandomXS128使用的MathUtils (它扩展了MathUtils的随机,但速度更快):
import com.badlogic.gdx.math.RandomXS128;
private Random random = new RandomXS128();MathUtils中方便的包装方法(随机()签名)也可以根据需要使用(复制到自己的类中),不管是静态的还是非静态的。例:
/** 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来在内部和外部使用,这使得用种子使用它是不安全的,并且在评论中没有提到这一点。
但是,如果你不像我这样小气的话,以上的解决办法应该是令人满意的。
https://stackoverflow.com/questions/51013197
复制相似问题