All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.commons.lang3.RandomUtils Maven / Gradle / Ivy

The newest version!
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.commons.lang3;

import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;

/**
 * Utility library that supplements the standard {@link Random} class.
 *
 * 

Caveat: Instances of {@link Random} are not cryptographically secure.

* *

Please note that the Apache Commons project provides a component * dedicated to pseudo-random number generation, namely * Commons RNG, that may be * a better choice for applications with more stringent requirements * (performance and/or correctness).

* * @deprecated Use Apache Commons RNG's optimized UniformRandomProvider * @since 3.3 */ @Deprecated public class RandomUtils { /** * Generates a random boolean value. * * @return the random boolean * @since 3.5 */ public static boolean nextBoolean() { return random().nextBoolean(); } /** * Generates an array of random bytes. * * @param count * the size of the returned array * @return the random byte array * @throws IllegalArgumentException if {@code count} is negative */ public static byte[] nextBytes(final int count) { Validate.isTrue(count >= 0, "Count cannot be negative."); final byte[] result = new byte[count]; random().nextBytes(result); return result; } /** * Generates a random double between 0 (inclusive) and Double.MAX_VALUE (exclusive). * * @return the random double * @see #nextDouble(double, double) * @since 3.5 */ public static double nextDouble() { return nextDouble(0, Double.MAX_VALUE); } /** * Generates a random double within the specified range. * * @param startInclusive * the smallest value that can be returned, must be non-negative * @param endExclusive * the upper bound (not included) * @throws IllegalArgumentException * if {@code startInclusive > endExclusive} or if * {@code startInclusive} is negative * @return the random double */ public static double nextDouble(final double startInclusive, final double endExclusive) { Validate.isTrue(endExclusive >= startInclusive, "Start value must be smaller or equal to end value."); Validate.isTrue(startInclusive >= 0, "Both range values must be non-negative."); if (startInclusive == endExclusive) { return startInclusive; } return startInclusive + ((endExclusive - startInclusive) * random().nextDouble()); } /** * Generates a random float between 0 (inclusive) and Float.MAX_VALUE (exclusive). * * @return the random float * @see #nextFloat(float, float) * @since 3.5 */ public static float nextFloat() { return nextFloat(0, Float.MAX_VALUE); } /** * Generates a random float within the specified range. * * @param startInclusive * the smallest value that can be returned, must be non-negative * @param endExclusive * the upper bound (not included) * @throws IllegalArgumentException * if {@code startInclusive > endExclusive} or if * {@code startInclusive} is negative * @return the random float */ public static float nextFloat(final float startInclusive, final float endExclusive) { Validate.isTrue(endExclusive >= startInclusive, "Start value must be smaller or equal to end value."); Validate.isTrue(startInclusive >= 0, "Both range values must be non-negative."); if (startInclusive == endExclusive) { return startInclusive; } return startInclusive + ((endExclusive - startInclusive) * random().nextFloat()); } /** * Generates a random int between 0 (inclusive) and Integer.MAX_VALUE (exclusive). * * @return the random integer * @see #nextInt(int, int) * @since 3.5 */ public static int nextInt() { return nextInt(0, Integer.MAX_VALUE); } /** * Generates a random integer within the specified range. * * @param startInclusive * the smallest value that can be returned, must be non-negative * @param endExclusive * the upper bound (not included) * @throws IllegalArgumentException * if {@code startInclusive > endExclusive} or if * {@code startInclusive} is negative * @return the random integer */ public static int nextInt(final int startInclusive, final int endExclusive) { Validate.isTrue(endExclusive >= startInclusive, "Start value must be smaller or equal to end value."); Validate.isTrue(startInclusive >= 0, "Both range values must be non-negative."); if (startInclusive == endExclusive) { return startInclusive; } return startInclusive + random().nextInt(endExclusive - startInclusive); } /** * Generates a random long between 0 (inclusive) and Long.MAX_VALUE (exclusive). * * @return the random long * @see #nextLong(long, long) * @since 3.5 */ public static long nextLong() { return nextLong(Long.MAX_VALUE); } /** * Generates a {@code long} value between 0 (inclusive) and the specified * value (exclusive). * * @param n Bound on the random number to be returned. Must be positive. * @return a random {@code long} value between 0 (inclusive) and {@code n} * (exclusive). */ private static long nextLong(final long n) { // Extracted from o.a.c.rng.core.BaseProvider.nextLong(long) long bits; long val; do { bits = random().nextLong() >>> 1; val = bits % n; } while (bits - val + (n - 1) < 0); return val; } /** * Generates a random long within the specified range. * * @param startInclusive * the smallest value that can be returned, must be non-negative * @param endExclusive * the upper bound (not included) * @throws IllegalArgumentException * if {@code startInclusive > endExclusive} or if * {@code startInclusive} is negative * @return the random long */ public static long nextLong(final long startInclusive, final long endExclusive) { Validate.isTrue(endExclusive >= startInclusive, "Start value must be smaller or equal to end value."); Validate.isTrue(startInclusive >= 0, "Both range values must be non-negative."); if (startInclusive == endExclusive) { return startInclusive; } return startInclusive + nextLong(endExclusive - startInclusive); } private static ThreadLocalRandom random() { return ThreadLocalRandom.current(); } /** * {@link RandomUtils} instances should NOT be constructed in standard * programming. Instead, the class should be used as * {@code RandomUtils.nextBytes(5);}. *

* This constructor is public to permit tools that require a JavaBean * instance to operate. *

*/ public RandomUtils() { } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy