【发布时间】:2021-11-13 05:41:44
【问题描述】:
我一直在用 Java 制作一个小游戏,我正在使用 Java Random 类来生成随机数。
在比赛过程中,两支球队互相比赛,为了确定谁赢了比赛,我生成了两个随机数(从 1 到 10,如 d10),然后对这些分数进行一些修改,比较看看谁赢了。
但我想知道是否有更有效的方法来做到这一点。我真的不知道 Java Random 类是如何工作的,但我的想法是我会生成一个随机数(从 1 到 100),然后整数除以 10 以获得其中一个数字,然后执行 mod 10找到另一个号码。
在代码中,我的问题是哪一个更快:
Random r = new Random();
int team1Score;
int team2Score;
int randNum;
// current version
team1Score = r.nextInt(10) + 1;
team2Score = r.nextInt(10) + 1;
// new version
randNum = r.nextInt(100) + 1;
team1Score = randNum / 10;
team2Score = randNum % 10;
如果有人有任何想法,有什么方法可以使它比这两种方法更有效吗?
【问题讨论】:
-
为什么不对两种方式进行基准测试并比较时间?如果伪随机生成器的成本很高,则第二种方法会更有效,但可能不会很多。测试并让时钟成为裁判。
-
我还要指出,优化的尝试产生了一个错误:你的第二个版本不应该给 r.nextInt(100) 加 1,它需要给 team1score 和 team2score 加 1范围 1-10 具有均匀的概率。这并不是要阻止尝试优化,只是手动滚动自定义随机分布是一个极其常见的错误来源。
-
好点,是的,这会弄乱整数除法一。有了这次经验,我会确保我通过所有自定义随机分布来找到类似这样的错误。
标签: java performance random