Random 仅使用一次¶
ID: java/random-used-once
Kind: problem
Security severity:
Severity: warning
Precision: medium
Tags:
- reliability
- maintainability
- external/cwe/cwe-335
Query suites:
- java-security-and-quality.qls
使用 java.util.Random 生成伪随机数序列的程序不应在每次需要新的伪随机数时都创建一个 Random 的新实例(例如,new Random().nextInt())。
根据 Java API 规范
如果使用相同的种子创建
Random的两个实例,并且对每个实例进行相同的调用方法序列,它们将生成并返回相同的数字序列。
这些调用返回的伪随机数序列仅取决于种子的值。如果您在每次需要伪随机数时都构造一个新的 Random 对象,即使无参数的 Random() 构造函数尝试用唯一的种子初始化自身,也不会生成良好的伪随机数分布。
建议¶
创建一个 Random 对象,并在生成伪随机数序列时使用同一实例(通过调用 nextInt、nextLong 等)。
示例¶
在以下示例中,每次通过创建 Random 的新实例来生成一系列伪随机数(例如 notReallyRandom 和 notReallyRandom2)不太可能产生伪随机数的良好分布。相比之下,每次通过调用 nextInt 来生成一系列伪随机数(例如 random1 和 random2)很可能产生良好的分布。这是因为这些数字仅基于一个 Random 对象。
public static void main(String args[]) {
// BAD: A new 'Random' object is created every time
// a pseudo-random integer is required.
int notReallyRandom = new Random().nextInt();
int notReallyRandom2 = new Random().nextInt();
// GOOD: The same 'Random' object is used to generate
// two pseudo-random integers.
Random r = new Random();
int random1 = r.nextInt();
int random2 = r.nextInt();
}