首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LibGDX对MathUtils.random()的内部调用干扰生成的随机数序列

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

Stack Overflow用户
提问于 2018-06-24 19:17:30
回答 1查看 390关注 0票数 4

当使用随机数发生器(RNG)与给定的种子多次(即。每次用相同的种子调用setSeed()以重新开始),我在每次传递时生成的数字序列中都会遇到一些偏差。在我的头撞了几次墙后,我找到了这样的理由:

box2dWorld.createBody()调用LongMap.put(),后者调用LongMap.push(),后者在while循环中调用MathUtils.random()

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

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

我如何知道MathUtils.random()在代码之外的确切位置和何时被调用?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-26 11:00:06

正如@Peter所指出的,一个人可以创建自己的RNG,这保证没有任何东西会干扰数字序列。

可以使用Java的“随机”:

代码语言:javascript
复制
import java.util.Random;

private Random random = new Random();

或者是由RandomXS128使用的MathUtils (它扩展了MathUtils的随机,但速度更快):

代码语言:javascript
复制
import com.badlogic.gdx.math.RandomXS128;

private Random random = new RandomXS128();

MathUtils中方便的包装方法(随机()签名)也可以根据需要使用(复制到自己的类中),不管是静态的还是非静态的。例:

代码语言:javascript
复制
/** 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来在内部和外部使用,这使得用种子使用它是不安全的,并且在评论中没有提到这一点。

但是,如果你不像我这样小气的话,以上的解决办法应该是令人满意的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51013197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档