Creating a new Random
object each time a random value is needed is inefficient and may produce numbers that are not random, depending
on the JDK. For better efficiency and randomness, create a single Random
, store it, and reuse it.
The Random()
constructor tries to set the seed with a distinct value every time. However, there is no guarantee that the seed will be
randomly or uniformly distributed. Some JDK will use the current time as seed, making the generated numbers not random.
This rule finds cases where a new Random
is created each time a method is invoked.
This rule doesn’t apply to classes that use a Random
in their constructors or the static main
function and nowhere
else.
Define and reuse the Random
object.
class MyClass { public void doSomethingCommon() { Random random = new Random(); // Noncompliant - new instance created with each invocation int rValue = random.nextInt(); } }
class MyClass { private Random random = new Random(); // Compliant public void doSomethingCommon() { int rValue = this.random.nextInt(); } }