【发布时间】:2015-01-01 03:28:15
【问题描述】:
作为蒙特卡罗模拟的一部分,我必须掷一组骰子,直到某些值出现一定次数。我的代码调用了一个骰子类,该类生成一个 1 到 6 之间的随机数,并返回它。最初的代码看起来像
public void roll() {
value = (int)(Math.random()*6) + 1;
}
而且速度不是很快。通过将 Math.random() 交换为
ThreadLocalRandom.current().nextInt(1, 7);
它运行一个部分的时间大约是原始时间的 60%,这大约是 2.5 亿次。 作为完整模拟的一部分,它至少会调用这种方法数十亿次,那么有没有更快的方法来做到这一点?
【问题讨论】:
-
你的结果给了你一个提示:并行化应该扩展到你的整个算法,而不仅仅是掷骰子。
-
我不确定我是否可以分块运行算法,因为它运行的次数取决于滚动值,它可能会在调用随机函数 6 次后终止
-
算法是什么?正如 duffymo 所指出的,如果您在顶层划分工作,那么您可以让多个线程并行处理数字。在没有看到实际算法/问题的情况下,我们只能提供一般性建议和疯狂猜测。
-
我明白了,算法是取一组 n 大小的骰子,滚动它们直到条件发生,当它发生时计算它花了多少次,并重复此操作最多 1,000,000 次,我猜这可能是线程的。结果被绘制成图表,所以它经历的迭代越多,结果就越准确,这样图表就越好。该图的重点是大致了解 O 复杂度有多大。
标签: java performance random