【问题标题】:Fastest way to generate two random numbers from the same range从同一范围生成两个随机数的最快方法
【发布时间】: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


【解决方案1】:

这是premature optimization 的示例。这两个示例之间的差异非常小,您真的不必担心。为了可读性,我会选择第一个。

【讨论】:

  • 感谢您的回答。因为我必须一次模拟数十万个这样的比赛,所以我只是想确保它尽可能快。
  • @riggsmarkham 在这种情况下,您可能需要考虑提出另一个关于优化 that 的问题 - 可能有一种聪明的方法可以重用值或批量计算。
  • 整个匹配算法是一个更大的野兽,所以我可能会再次亲自经历一遍以尝试优化它。但是,谢谢,我可能会在此之后将其全部发布在这里以征求建议!
猜你喜欢
  • 1970-01-01
  • 2018-04-08
  • 2010-10-26
  • 1970-01-01
  • 2022-10-04
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多