Home | History | Annotate | Download | only in random
      1 /*
      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 
     18 package org.apache.commons.math.random;
     19 import 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  */
     25 public 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 }
    273