001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018package org.apache.commons.math3.random;
019import java.util.Collection;
020
021import org.apache.commons.math3.exception.NotANumberException;
022import org.apache.commons.math3.exception.NotFiniteNumberException;
023import org.apache.commons.math3.exception.NotStrictlyPositiveException;
024import org.apache.commons.math3.exception.NumberIsTooLargeException;
025
026/**
027 * Random data generation utilities.
028 * @deprecated to be removed in 4.0.  Use {@link RandomDataGenerator} directly
029 */
030@Deprecated
031public interface RandomData {
032    /**
033     * Generates a random string of hex characters of length {@code len}.
034     * <p>
035     * The generated string will be random, but not cryptographically
036     * secure. To generate cryptographically secure strings, use
037     * {@link #nextSecureHexString(int)}.
038     * </p>
039     *
040     * @param len the length of the string to be generated
041     * @return a random string of hex characters of length {@code len}
042     * @throws NotStrictlyPositiveException
043     * if {@code len <= 0}
044     */
045    String nextHexString(int len) throws NotStrictlyPositiveException;
046
047    /**
048     * Generates a uniformly distributed random integer between {@code lower}
049     * and {@code upper} (endpoints included).
050     * <p>
051     * The generated integer will be random, but not cryptographically secure.
052     * To generate cryptographically secure integer sequences, use
053     * {@link #nextSecureInt(int, int)}.
054     * </p>
055     *
056     * @param lower lower bound for generated integer
057     * @param upper upper bound for generated integer
058     * @return a random integer greater than or equal to {@code lower}
059     * and less than or equal to {@code upper}
060     * @throws NumberIsTooLargeException if {@code lower >= upper}
061     */
062    int nextInt(int lower, int upper) throws NumberIsTooLargeException;
063
064    /**
065     * Generates a uniformly distributed random long integer between
066     * {@code lower} and {@code upper} (endpoints included).
067     * <p>
068     * The generated long integer values will be random, but not
069     * cryptographically secure. To generate cryptographically secure sequences
070     * of longs, use {@link #nextSecureLong(long, long)}.
071     * </p>
072     *
073     * @param lower lower bound for generated long integer
074     * @param upper upper bound for generated long integer
075     * @return a random long integer greater than or equal to {@code lower} and
076     * less than or equal to {@code upper}
077     * @throws NumberIsTooLargeException if {@code lower >= upper}
078     */
079    long nextLong(long lower, long upper) throws NumberIsTooLargeException;
080
081    /**
082     * Generates a random string of hex characters from a secure random
083     * sequence.
084     * <p>
085     * If cryptographic security is not required, use
086     * {@link #nextHexString(int)}.
087     * </p>
088     *
089     * @param len the length of the string to be generated
090     * @return a random string of hex characters of length {@code len}
091     * @throws NotStrictlyPositiveException if {@code len <= 0}
092     */
093    String nextSecureHexString(int len) throws NotStrictlyPositiveException;
094
095    /**
096     * Generates a uniformly distributed random integer between {@code lower}
097     * and {@code upper} (endpoints included) from a secure random sequence.
098     * <p>
099     * Sequences of integers generated using this method will be
100     * cryptographically secure. If cryptographic security is not required,
101     * {@link #nextInt(int, int)} should be used instead of this method.</p>
102     * <p>
103     * <strong>Definition</strong>:
104     * <a href="http://en.wikipedia.org/wiki/Cryptographically_secure_pseudo-random_number_generator">
105     * Secure Random Sequence</a></p>
106     *
107     * @param lower lower bound for generated integer
108     * @param upper upper bound for generated integer
109     * @return a random integer greater than or equal to {@code lower} and less
110     * than or equal to {@code upper}.
111     * @throws NumberIsTooLargeException if {@code lower >= upper}.
112     */
113    int nextSecureInt(int lower, int upper) throws NumberIsTooLargeException;
114
115    /**
116     * Generates a uniformly distributed random long integer between
117     * {@code lower} and {@code upper} (endpoints included) from a secure random
118     * sequence.
119     * <p>
120     * Sequences of long values generated using this method will be
121     * cryptographically secure. If cryptographic security is not required,
122     * {@link #nextLong(long, long)} should be used instead of this method.</p>
123     * <p>
124     * <strong>Definition</strong>:
125     * <a href="http://en.wikipedia.org/wiki/Cryptographically_secure_pseudo-random_number_generator">
126     * Secure Random Sequence</a></p>
127     *
128     * @param lower lower bound for generated integer
129     * @param upper upper bound for generated integer
130     * @return a random long integer greater than or equal to {@code lower} and
131     * less than or equal to {@code upper}.
132     * @throws NumberIsTooLargeException if {@code lower >= upper}.
133     */
134    long nextSecureLong(long lower, long upper) throws NumberIsTooLargeException;
135
136    /**
137     * Generates a random value from the Poisson distribution with the given
138     * mean.
139     * <p>
140     * <strong>Definition</strong>:
141     * <a href="http://www.itl.nist.gov/div898/handbook/eda/section3/eda366j.htm">
142     * Poisson Distribution</a></p>
143     *
144     * @param mean the mean of the Poisson distribution
145     * @return a random value following the specified Poisson distribution
146     * @throws NotStrictlyPositiveException if {@code mean <= 0}.
147     */
148    long nextPoisson(double mean) throws NotStrictlyPositiveException;
149
150    /**
151     * Generates a random value from the Normal (or Gaussian) distribution with
152     * specified mean and standard deviation.
153     * <p>
154     * <strong>Definition</strong>:
155     * <a href="http://www.itl.nist.gov/div898/handbook/eda/section3/eda3661.htm">
156     * Normal Distribution</a></p>
157     *
158     * @param mu the mean of the distribution
159     * @param sigma the standard deviation of the distribution
160     * @return a random value following the specified Gaussian distribution
161     * @throws NotStrictlyPositiveException if {@code sigma <= 0}.
162     */
163    double nextGaussian(double mu, double sigma) throws NotStrictlyPositiveException;
164
165    /**
166     * Generates a random value from the exponential distribution
167     * with specified mean.
168     * <p>
169     * <strong>Definition</strong>:
170     * <a href="http://www.itl.nist.gov/div898/handbook/eda/section3/eda3667.htm">
171     * Exponential Distribution</a></p>
172     *
173     * @param mean the mean of the distribution
174     * @return a random value following the specified exponential distribution
175     * @throws NotStrictlyPositiveException if {@code mean <= 0}.
176     */
177    double nextExponential(double mean) throws NotStrictlyPositiveException;
178
179    /**
180     * Generates a uniformly distributed random value from the open interval
181     * {@code (lower, upper)} (i.e., endpoints excluded).
182     * <p>
183     * <strong>Definition</strong>:
184     * <a href="http://www.itl.nist.gov/div898/handbook/eda/section3/eda3662.htm">
185     * Uniform Distribution</a> {@code lower} and {@code upper - lower} are the
186     * <a href = "http://www.itl.nist.gov/div898/handbook/eda/section3/eda364.htm">
187     * location and scale parameters</a>, respectively.</p>
188     *
189     * @param lower the exclusive lower bound of the support
190     * @param upper the exclusive upper bound of the support
191     * @return a uniformly distributed random value between lower and upper
192     * (exclusive)
193     * @throws NumberIsTooLargeException if {@code lower >= upper}
194     * @throws NotFiniteNumberException if one of the bounds is infinite
195     * @throws NotANumberException if one of the bounds is NaN
196     */
197    double nextUniform(double lower, double upper)
198        throws NumberIsTooLargeException, NotFiniteNumberException, NotANumberException;
199
200    /**
201     * Generates a uniformly distributed random value from the interval
202     * {@code (lower, upper)} or the interval {@code [lower, upper)}. The lower
203     * bound is thus optionally included, while the upper bound is always
204     * excluded.
205     * <p>
206     * <strong>Definition</strong>:
207     * <a href="http://www.itl.nist.gov/div898/handbook/eda/section3/eda3662.htm">
208     * Uniform Distribution</a> {@code lower} and {@code upper - lower} are the
209     * <a href = "http://www.itl.nist.gov/div898/handbook/eda/section3/eda364.htm">
210     * location and scale parameters</a>, respectively.</p>
211     *
212     * @param lower the lower bound of the support
213     * @param upper the exclusive upper bound of the support
214     * @param lowerInclusive {@code true} if the lower bound is inclusive
215     * @return uniformly distributed random value in the {@code (lower, upper)}
216     * interval, if {@code lowerInclusive} is {@code false}, or in the
217     * {@code [lower, upper)} interval, if {@code lowerInclusive} is
218     * {@code true}
219     * @throws NumberIsTooLargeException if {@code lower >= upper}
220     * @throws NotFiniteNumberException if one of the bounds is infinite
221     * @throws NotANumberException if one of the bounds is NaN
222     */
223    double nextUniform(double lower, double upper, boolean lowerInclusive)
224        throws NumberIsTooLargeException, NotFiniteNumberException, NotANumberException;
225
226    /**
227     * Generates an integer array of length {@code k} whose entries are selected
228     * randomly, without repetition, from the integers {@code 0, ..., n - 1}
229     * (inclusive).
230     * <p>
231     * Generated arrays represent permutations of {@code n} taken {@code k} at a
232     * time.</p>
233     *
234     * @param n the domain of the permutation
235     * @param k the size of the permutation
236     * @return a random {@code k}-permutation of {@code n}, as an array of
237     * integers
238     * @throws NumberIsTooLargeException if {@code k > n}.
239     * @throws NotStrictlyPositiveException if {@code k <= 0}.
240     */
241    int[] nextPermutation(int n, int k)
242        throws NumberIsTooLargeException, NotStrictlyPositiveException;
243
244    /**
245     * Returns an array of {@code k} objects selected randomly from the
246     * Collection {@code c}.
247     * <p>
248     * Sampling from {@code c} is without replacement; but if {@code c} contains
249     * identical objects, the sample may include repeats.  If all elements of
250     * {@code c} are distinct, the resulting object array represents a
251     * <a href="http://rkb.home.cern.ch/rkb/AN16pp/node250.html#SECTION0002500000000000000000">
252     * Simple Random Sample</a> of size {@code k} from the elements of
253     * {@code c}.</p>
254     *
255     * @param c the collection to be sampled
256     * @param k the size of the sample
257     * @return a random sample of {@code k} elements from {@code c}
258     * @throws NumberIsTooLargeException if {@code k > c.size()}.
259     * @throws NotStrictlyPositiveException if {@code k <= 0}.
260     */
261    Object[] nextSample(Collection<?> c, int k)
262        throws NumberIsTooLargeException, NotStrictlyPositiveException;
263
264}