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

标签 random libgdx box2d

在多次使用具有给定种子的随机数生成器 (RNG) 时(即每次使用相同的种子调用 setSeed() 以重新开始),我在每次通过时生成的数字序列中遇到了一些偏差。在我的头撞墙几次后,我发现原因是这样的:
box2dWorld.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/

相关文章:

iphone - 在 Cocos2d 和 Box2d 中获取 body 上的接触点

python-3.x - PRNG 的种子大小(以位为单位)有什么不同吗?

java - libgdx:加载游戏中所有 Assets 的最佳方式

java - 我如何检测是否在 Java libGDX 中触摸了 Sprite ?

c++ - Box2D - 在运行时创建主体时,主体不会发生碰撞

java - Box2D 碰撞不会调用我自己的 CollisionListener

java - 随机化 LiveData<List<name>

Java-单击按钮时更改标签文本

algorithm - 在矩形内生成一个随机点(均匀地)

java - 将多媒体与 LibGDX 集成