【发布时间】:2012-10-24 04:25:22
【问题描述】:
我需要生成最大范围内的随机整数。由于性能至关重要,我决定使用 XORShift 生成器而不是 Java 的 Random 类。
long seed = System.nanoTime();
seed ^= (seed << 21);
seed ^= (seed >>> 35);
seed ^= (seed << 4);
这个实现 (source) 给了我一个长整数,但我真正想要的是一个介于 0 和最大值之间的整数。
public int random(int max){ /*...*/}
实现此方法最有效的方法是什么?
【问题讨论】:
-
你不能把long取最大值吗?
-
@SajitKunnumkal 这会对某些整数产生(轻微)偏差(当然,如果 max 足够小,则可以忽略不计)。
-
如果性能很关键,你应该避免
nanoTime()。 -
如果性能很关键,您可能应该改用简单的 LCG。如果 max 是恒定的并且提前知道,您甚至可以构建一个 ad-hoc LCG,它将直接生成 [0, max) 范围内的数字而没有偏差。
-
使用 XORShift 时不应该考虑性能;您正在使用它的事实意味着它适用于非关键应用程序,这意味着 System.nanoTime() 非常适合。
标签: java performance random