blob: 0fc51365999b3a6f49c41e4b47d145a65080a5f7 [file] [log] [blame]
Raymonddee08492015-04-02 10:43:13 -07001/*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18package org.apache.commons.math.random;
19import java.util.Collection;
20
21/**
22 * Random data generation utilities.
23 * @version $Revision: 780975 $ $Date: 2009-06-02 11:05:37 +0200 (mar. 02 juin 2009) $
24 */
25public interface RandomData {
26 /**
27 * Generates a random string of hex characters of length
28 * <code>len</code>.
29 * <p>
30 * The generated string will be random, but not cryptographically
31 * secure. To generate cryptographically secure strings, use
32 * <code>nextSecureHexString</code></p>
33 * <p>
34 * <strong>Preconditions</strong>:<ul>
35 * <li><code>len > 0</code> (otherwise an IllegalArgumentException
36 * is thrown.)</li>
37 * </ul></p>
38 *
39 * @param len the length of the string to be generated
40 * @return random string of hex characters of length <code>len</code>
41 */
42 String nextHexString(int len);
43
44 /**
45 * Generates a uniformly distributed random integer between
46 * <code>lower</code> and <code>upper</code> (endpoints included).
47 * <p>
48 * The generated integer will be random, but not cryptographically secure.
49 * To generate cryptographically secure integer sequences, use
50 * <code>nextSecureInt</code>.</p>
51 * <p>
52 * <strong>Preconditions</strong>:<ul>
53 * <li><code>lower < upper</code> (otherwise an IllegalArgumentException
54 * is thrown.)</li>
55 * </ul></p>
56 *
57 * @param lower lower bound for generated integer
58 * @param upper upper bound for generated integer
59 * @return a random integer greater than or equal to <code>lower</code>
60 * and less than or equal to <code>upper</code>.
61 */
62 int nextInt(int lower, int upper);
63
64 /**
65 * Generates a uniformly distributed random long integer between
66 * <code>lower</code> and <code>upper</code> (endpoints included).
67 * <p>
68 * The generated long integer values will be random, but not
69 * cryptographically secure.
70 * To generate cryptographically secure sequences of longs, use
71 * <code>nextSecureLong</code></p>
72 * <p>
73 * <strong>Preconditions</strong>:<ul>
74 * <li><code>lower < upper</code> (otherwise an IllegalArgumentException
75 * is thrown.)</li>
76 * </ul></p>
77 *
78 * @param lower lower bound for generated integer
79 * @param upper upper bound for generated integer
80 * @return a random integer greater than or equal to <code>lower</code>
81 * and less than or equal to <code>upper</code>.
82 */
83 long nextLong(long lower, long upper);
84
85 /**
86 * Generates a random string of hex characters from a secure random
87 * sequence.
88 * <p>
89 * If cryptographic security is not required,
90 * use <code>nextHexString()</code>.</p>
91 * <p>
92 * <strong>Preconditions</strong>:<ul>
93 * <li><code>len > 0</code> (otherwise an IllegalArgumentException
94 * is thrown.)</li>
95 * </ul></p>
96 * @param len length of return string
97 * @return the random hex string
98 */
99 String nextSecureHexString(int len);
100
101 /**
102 * Generates a uniformly distributed random integer between
103 * <code>lower</code> and <code>upper</code> (endpoints included)
104 * from a secure random sequence.
105 * <p>
106 * Sequences of integers generated using this method will be
107 * cryptographically secure. If cryptographic security is not required,
108 * <code>nextInt</code> should be used instead of this method.</p>
109 * <p>
110 * <strong>Definition</strong>:
111 * <a href="http://en.wikipedia.org/wiki/Cryptographically_secure_pseudo-random_number_generator">
112 * Secure Random Sequence</a></p>
113 * <p>
114 * <strong>Preconditions</strong>:<ul>
115 * <li><code>lower < upper</code> (otherwise an IllegalArgumentException
116 * is thrown.)</li>
117 * </ul></p>
118 *
119 * @param lower lower bound for generated integer
120 * @param upper upper bound for generated integer
121 * @return a random integer greater than or equal to <code>lower</code>
122 * and less than or equal to <code>upper</code>.
123 */
124 int nextSecureInt(int lower, int upper);
125
126 /**
127 * Generates a random long integer between <code>lower</code>
128 * and <code>upper</code> (endpoints included).
129 * <p>
130 * Sequences of long values generated using this method will be
131 * cryptographically secure. If cryptographic security is not required,
132 * <code>nextLong</code> should be used instead of this method.</p>
133 * <p>
134 * <strong>Definition</strong>:
135 * <a href="http://en.wikipedia.org/wiki/Cryptographically_secure_pseudo-random_number_generator">
136 * Secure Random Sequence</a></p>
137 * <p>
138 * <strong>Preconditions</strong>:<ul>
139 * <li><code>lower < upper</code> (otherwise an IllegalArgumentException
140 * is thrown.)</li>
141 * </ul></p>
142 *
143 * @param lower lower bound for generated integer
144 * @param upper upper bound for generated integer
145 * @return a long integer greater than or equal to <code>lower</code>
146 * and less than or equal to <code>upper</code>.
147 */
148 long nextSecureLong(long lower, long upper);
149
150 /**
151 * Generates a random value from the Poisson distribution with
152 * the given mean.
153 * <p>
154 * <strong>Definition</strong>:
155 * <a href="http://www.itl.nist.gov/div898/handbook/eda/section3/eda366j.htm">
156 * Poisson Distribution</a></p>
157 * <p>
158 * <strong>Preconditions</strong>: <ul>
159 * <li>The specified mean <i>must</i> be positive (otherwise an
160 * IllegalArgumentException is thrown.)</li>
161 * </ul></p>
162 * @param mean Mean of the distribution
163 * @return poisson deviate with the specified mean
164 */
165 long nextPoisson(double mean);
166
167 /**
168 * Generates a random value from the
169 * Normal (or Gaussian) distribution with the given mean
170 * and standard deviation.
171 * <p>
172 * <strong>Definition</strong>:
173 * <a href="http://www.itl.nist.gov/div898/handbook/eda/section3/eda3661.htm">
174 * Normal Distribution</a></p>
175 * <p>
176 * <strong>Preconditions</strong>: <ul>
177 * <li><code>sigma > 0</code> (otherwise an IllegalArgumentException
178 * is thrown.)</li>
179 * </ul></p>
180 * @param mu Mean of the distribution
181 * @param sigma Standard deviation of the distribution
182 * @return random value from Gaussian distribution with mean = mu,
183 * standard deviation = sigma
184 */
185 double nextGaussian(double mu, double sigma);
186
187 /**
188 * Generates a random value from the exponential distribution
189 * with expected value = <code>mean</code>.
190 * <p>
191 * <strong>Definition</strong>:
192 * <a href="http://www.itl.nist.gov/div898/handbook/eda/section3/eda3667.htm">
193 * Exponential Distribution</a></p>
194 * <p>
195 * <strong>Preconditions</strong>: <ul>
196 * <li><code>mu >= 0</code> (otherwise an IllegalArgumentException
197 * is thrown.)</li>
198 * </ul></p>
199 * @param mean Mean of the distribution
200 * @return random value from exponential distribution
201 */
202 double nextExponential(double mean);
203
204 /**
205 * Generates a uniformly distributed random value from the open interval
206 * (<code>lower</code>,<code>upper</code>) (i.e., endpoints excluded).
207 * <p>
208 * <strong>Definition</strong>:
209 * <a href="http://www.itl.nist.gov/div898/handbook/eda/section3/eda3662.htm">
210 * Uniform Distribution</a> <code>lower</code> and
211 * <code>upper - lower</code> are the
212 * <a href = "http://www.itl.nist.gov/div898/handbook/eda/section3/eda364.htm">
213 * location and scale parameters</a>, respectively.</p>
214 * <p>
215 * <strong>Preconditions</strong>:<ul>
216 * <li><code>lower < upper</code> (otherwise an IllegalArgumentException
217 * is thrown.)</li>
218 * </ul></p>
219 *
220 * @param lower lower endpoint of the interval of support
221 * @param upper upper endpoint of the interval of support
222 * @return uniformly distributed random value between lower
223 * and upper (exclusive)
224 */
225 double nextUniform(double lower, double upper);
226
227 /**
228 * Generates an integer array of length <code>k</code> whose entries
229 * are selected randomly, without repetition, from the integers <code>
230 * 0 through n-1</code> (inclusive).
231 * <p>
232 * Generated arrays represent permutations
233 * of <code>n</code> taken <code>k</code> at a time.</p>
234 * <p>
235 * <strong>Preconditions:</strong><ul>
236 * <li> <code>k <= n</code></li>
237 * <li> <code>n > 0</code> </li>
238 * </ul>
239 * If the preconditions are not met, an IllegalArgumentException is
240 * thrown.</p>
241 *
242 * @param n domain of the permutation
243 * @param k size of the permutation
244 * @return random k-permutation of n
245 */
246 int[] nextPermutation(int n, int k);
247
248 /**
249 * Returns an array of <code>k</code> objects selected randomly
250 * from the Collection <code>c</code>.
251 * <p>
252 * Sampling from <code>c</code>
253 * is without replacement; but if <code>c</code> contains identical
254 * objects, the sample may include repeats. If all elements of <code>
255 * c</code> are distinct, the resulting object array represents a
256 * <a href="http://rkb.home.cern.ch/rkb/AN16pp/node250.html#SECTION0002500000000000000000">
257 * Simple Random Sample</a> of size
258 * <code>k</code> from the elements of <code>c</code>.</p>
259 * <p>
260 * <strong>Preconditions:</strong><ul>
261 * <li> k must be less than or equal to the size of c </li>
262 * <li> c must not be empty </li>
263 * </ul>
264 * If the preconditions are not met, an IllegalArgumentException is
265 * thrown.</p>
266 *
267 * @param c collection to be sampled
268 * @param k size of the sample
269 * @return random sample of k elements from c
270 */
271 Object[] nextSample(Collection<?> c, int k);
272}