001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019 package org.apache.commons.lang.math;
020
021 import java.util.Random;
022
023 /**
024 * <p><code>RandomUtils</code> is a wrapper that supports all possible
025 * {@link java.util.Random} methods via the {@link java.lang.Math#random()}
026 * method and its system-wide <code>Random</code> object.
027 *
028 * @author Gary D. Gregory
029 * @since 2.0
030 * @version $Id: RandomUtils.java 906320 2010-02-04 01:41:10Z sebb $
031 */
032 public class RandomUtils {
033
034 /**
035 * An instance of {@link JVMRandom}.
036 */
037 public static final Random JVM_RANDOM = new JVMRandom();
038
039 // should be possible for JVM_RANDOM?
040 // public static void nextBytes(byte[]) {
041 // public synchronized double nextGaussian();
042 // }
043
044 /**
045 * <p>Returns the next pseudorandom, uniformly distributed int value
046 * from the Math.random() sequence.</p>
047 * <b>N.B. All values are >= 0.<b>
048 * @return the random int
049 */
050 public static int nextInt() {
051 return nextInt(JVM_RANDOM);
052 }
053
054 /**
055 * <p>Returns the next pseudorandom, uniformly distributed int value
056 * from the given <code>random</code> sequence.</p>
057 *
058 * @param random the Random sequence generator.
059 * @return the random int
060 */
061 public static int nextInt(Random random) {
062 return random.nextInt();
063 }
064
065 /**
066 * <p>Returns a pseudorandom, uniformly distributed int value
067 * between <code>0</code> (inclusive) and the specified value
068 * (exclusive), from the Math.random() sequence.</p>
069 *
070 * @param n the specified exclusive max-value
071 * @return the random int
072 */
073 public static int nextInt(int n) {
074 return nextInt(JVM_RANDOM, n);
075 }
076
077 /**
078 * <p>Returns a pseudorandom, uniformly distributed int value
079 * between <code>0</code> (inclusive) and the specified value
080 * (exclusive), from the given Random sequence.</p>
081 *
082 * @param random the Random sequence generator.
083 * @param n the specified exclusive max-value
084 * @return the random int
085 */
086 public static int nextInt(Random random, int n) {
087 // check this cannot return 'n'
088 return random.nextInt(n);
089 }
090
091 /**
092 * <p>Returns the next pseudorandom, uniformly distributed long value
093 * from the Math.random() sequence.</p>
094 * <b>N.B. All values are >= 0.<b>
095 * @return the random long
096 */
097 public static long nextLong() {
098 return nextLong(JVM_RANDOM);
099 }
100
101 /**
102 * <p>Returns the next pseudorandom, uniformly distributed long value
103 * from the given Random sequence.</p>
104 *
105 * @param random the Random sequence generator.
106 * @return the random long
107 */
108 public static long nextLong(Random random) {
109 return random.nextLong();
110 }
111
112 /**
113 * <p>Returns the next pseudorandom, uniformly distributed boolean value
114 * from the Math.random() sequence.</p>
115 *
116 * @return the random boolean
117 */
118 public static boolean nextBoolean() {
119 return nextBoolean(JVM_RANDOM);
120 }
121
122 /**
123 * <p>Returns the next pseudorandom, uniformly distributed boolean value
124 * from the given random sequence.</p>
125 *
126 * @param random the Random sequence generator.
127 * @return the random boolean
128 */
129 public static boolean nextBoolean(Random random) {
130 return random.nextBoolean();
131 }
132
133 /**
134 * <p>Returns the next pseudorandom, uniformly distributed float value
135 * between <code>0.0</code> and <code>1.0</code> from the Math.random()
136 * sequence.</p>
137 *
138 * @return the random float
139 */
140 public static float nextFloat() {
141 return nextFloat(JVM_RANDOM);
142 }
143
144 /**
145 * <p>Returns the next pseudorandom, uniformly distributed float value
146 * between <code>0.0</code> and <code>1.0</code> from the given Random
147 * sequence.</p>
148 *
149 * @param random the Random sequence generator.
150 * @return the random float
151 */
152 public static float nextFloat(Random random) {
153 return random.nextFloat();
154 }
155
156 /**
157 * <p>Returns the next pseudorandom, uniformly distributed float value
158 * between <code>0.0</code> and <code>1.0</code> from the Math.random()
159 * sequence.</p>
160 *
161 * @return the random double
162 */
163 public static double nextDouble() {
164 return nextDouble(JVM_RANDOM);
165 }
166
167 /**
168 * <p>Returns the next pseudorandom, uniformly distributed float value
169 * between <code>0.0</code> and <code>1.0</code> from the given Random
170 * sequence.</p>
171 *
172 * @param random the Random sequence generator.
173 * @return the random double
174 */
175 public static double nextDouble(Random random) {
176 return random.nextDouble();
177 }
178
179 }