random.java

来自「This is a resource based on j2me embedde」· Java 代码 · 共 477 行 · 第 1/2 页

JAVA
477
字号
     *         bits = next(31);     *         val = bits % n;     *     } while(bits - val + (n-1) < 0);     *     return val;     * }     * </pre></blockquote>     * <p>     * The hedge "approximately" is used in the foregoing description only      * because the next method is only approximately an unbiased source of     * independently chosen bits.  If it were a perfect source of randomly      * chosen bits, then the algorithm shown would choose <tt>int</tt>      * values from the stated range with perfect uniformity.     * <p>     * The algorithm is slightly tricky.  It rejects values that would result     * in an uneven distribution (due to the fact that 2^31 is not divisible     * by n). The probability of a value being rejected depends on n.  The     * worst case is n=2^30+1, for which the probability of a reject is 1/2,     * and the expected number of iterations before the loop terminates is 2.     * <p>     * The algorithm treats the case where n is a power of two specially: it     * returns the correct number of high-order bits from the underlying     * pseudo-random number generator.  In the absence of special treatment,     * the correct number of <i>low-order</i> bits would be returned.  Linear     * congruential pseudo-random number generators such as the one     * implemented by this class are known to have short periods in the     * sequence of values of their low-order bits.  Thus, this special case     * greatly increases the length of the sequence of values returned by     * successive calls to this method if n is a small power of two.     *     * @param n the bound on the random number to be returned.  Must be     *	      positive.     * @return  a pseudorandom, uniformly distributed <tt>int</tt>     *          value between 0 (inclusive) and n (exclusive).     * @exception IllegalArgumentException n is not positive.     * @since 1.2     */    public int nextInt(int n) {        if (n<=0)            throw new IllegalArgumentException("n must be positive");        if ((n & -n) == n)  // i.e., n is a power of 2            return (int)((n * (long)next(31)) >> 31);        int bits, val;        do {            bits = next(31);            val = bits % n;        } while(bits - val + (n-1) < 0);        return val;    }    /**     * Returns the next pseudorandom, uniformly distributed <code>long</code>     * value from this random number generator's sequence. The general      * contract of <tt>nextLong</tt> is that one long value is pseudorandomly      * generated and returned. All 2<font size="-1"><sup>64</sup></font>      * possible <tt>long</tt> values are produced with (approximately) equal      * probability. The method <tt>nextLong</tt> is implemented by class      * <tt>Random</tt> as follows:     * <blockquote><pre>     * public long nextLong() {     *       return ((long)next(32) << 32) + next(32);     * }</pre></blockquote>     *     * @return  the next pseudorandom, uniformly distributed <code>long</code>     *          value from this random number generator's sequence.     */    public long nextLong() {        // it's okay that the bottom word remains signed.        return ((long)(next(32)) << 32) + next(32);    }    /**     * Returns the next pseudorandom, uniformly distributed     * <code>boolean</code> value from this random number generator's     * sequence. The general contract of <tt>nextBoolean</tt> is that one     * <tt>boolean</tt> value is pseudorandomly generated and returned.  The     * values <code>true</code> and <code>false</code> are produced with     * (approximately) equal probability. The method <tt>nextBoolean</tt> is     * implemented by class <tt>Random</tt> as follows:     * <blockquote><pre>     * public boolean nextBoolean() {return next(1) != 0;}     * </pre></blockquote>     * @return  the next pseudorandom, uniformly distributed     *          <code>boolean</code> value from this random number generator's     *		sequence.     * @since 1.2     */    public boolean nextBoolean() {return next(1) != 0;}    /**     * Returns the next pseudorandom, uniformly distributed <code>float</code>     * value between <code>0.0</code> and <code>1.0</code> from this random     * number generator's sequence. <p>     * The general contract of <tt>nextFloat</tt> is that one <tt>float</tt>      * value, chosen (approximately) uniformly from the range <tt>0.0f</tt>      * (inclusive) to <tt>1.0f</tt> (exclusive), is pseudorandomly     * generated and returned. All 2<font size="-1"><sup>24</sup></font>      * possible <tt>float</tt> values of the form      * <i>m&nbsp;x&nbsp</i>2<font size="-1"><sup>-24</sup></font>, where      * <i>m</i> is a positive integer less than 2<font size="-1"><sup>24</sup>     * </font>, are produced with (approximately) equal probability. The      * method <tt>nextFloat</tt> is implemented by class <tt>Random</tt> as      * follows:     * <blockquote><pre>     * public float nextFloat() {     *      return next(24) / ((float)(1 << 24));     * }</pre></blockquote>     * The hedge "approximately" is used in the foregoing description only      * because the next method is only approximately an unbiased source of      * independently chosen bits. If it were a perfect source or randomly      * chosen bits, then the algorithm shown would choose <tt>float</tt>      * values from the stated range with perfect uniformity.<p>     * [In early versions of Java, the result was incorrectly calculated as:     * <blockquote><pre>     * return next(30) / ((float)(1 << 30));</pre></blockquote>     * This might seem to be equivalent, if not better, but in fact it      * introduced a slight nonuniformity because of the bias in the rounding      * of floating-point numbers: it was slightly more likely that the      * low-order bit of the significand would be 0 than that it would be 1.]      *     * @return  the next pseudorandom, uniformly distributed <code>float</code>     *          value between <code>0.0</code> and <code>1.0</code> from this     *          random number generator's sequence.     */    public float nextFloat() {        int i = next(24);        return i / ((float)(1 << 24));    }    /**     * Returns the next pseudorandom, uniformly distributed      * <code>double</code> value between <code>0.0</code> and     * <code>1.0</code> from this random number generator's sequence. <p>     * The general contract of <tt>nextDouble</tt> is that one      * <tt>double</tt> value, chosen (approximately) uniformly from the      * range <tt>0.0d</tt> (inclusive) to <tt>1.0d</tt> (exclusive), is      * pseudorandomly generated and returned. All      * 2<font size="-1"><sup>53</sup></font> possible <tt>float</tt>      * values of the form <i>m&nbsp;x&nbsp;</i>2<font size="-1"><sup>-53</sup>     * </font>, where <i>m</i> is a positive integer less than      * 2<font size="-1"><sup>53</sup></font>, are produced with      * (approximately) equal probability. The method <tt>nextDouble</tt> is      * implemented by class <tt>Random</tt> as follows:     * <blockquote><pre>     * public double nextDouble() {     *       return (((long)next(26) << 27) + next(27))     *           / (double)(1L << 53);     * }</pre></blockquote><p>     * The hedge "approximately" is used in the foregoing description only      * because the <tt>next</tt> method is only approximately an unbiased      * source of independently chosen bits. If it were a perfect source or      * randomly chosen bits, then the algorithm shown would choose      * <tt>double</tt> values from the stated range with perfect uniformity.      * <p>[In early versions of Java, the result was incorrectly calculated as:     * <blockquote><pre>     *  return (((long)next(27) << 27) + next(27))     *      / (double)(1L << 54);</pre></blockquote>     * This might seem to be equivalent, if not better, but in fact it      * introduced a large nonuniformity because of the bias in the rounding      * of floating-point numbers: it was three times as likely that the      * low-order bit of the significand would be 0 than that it would be     * 1! This nonuniformity probably doesn't matter much in practice, but      * we strive for perfection.]      *     * @return  the next pseudorandom, uniformly distributed      *          <code>double</code> value between <code>0.0</code> and     *          <code>1.0</code> from this random number generator's sequence.     */    public double nextDouble() {        long l = ((long)(next(26)) << 27) + next(27);        return l / (double)(1L << 53);    }    private double nextNextGaussian;    private boolean haveNextNextGaussian = false;    /**     * Returns the next pseudorandom, Gaussian ("normally") distributed     * <code>double</code> value with mean <code>0.0</code> and standard     * deviation <code>1.0</code> from this random number generator's sequence.     * <p>     * The general contract of <tt>nextGaussian</tt> is that one      * <tt>double</tt> value, chosen from (approximately) the usual      * normal distribution with mean <tt>0.0</tt> and standard deviation      * <tt>1.0</tt>, is pseudorandomly generated and returned. The method      * <tt>nextGaussian</tt> is implemented by class <tt>Random</tt> as follows:     * <blockquote><pre>     * synchronized public double nextGaussian() {     *    if (haveNextNextGaussian) {     *            haveNextNextGaussian = false;     *            return nextNextGaussian;     *    } else {     *            double v1, v2, s;     *            do {      *                    v1 = 2 * nextDouble() - 1;   // between -1.0 and 1.0     *                    v2 = 2 * nextDouble() - 1;   // between -1.0 and 1.0     *                    s = v1 * v1 + v2 * v2;     *            } while (s >= 1 || s == 0);     *            double multiplier = Math.sqrt(-2 * Math.log(s)/s);     *            nextNextGaussian = v2 * multiplier;     *            haveNextNextGaussian = true;     *            return v1 * multiplier;     *    }     * }</pre></blockquote>     * This uses the <i>polar method</i> of G. E. P. Box, M. E. Muller, and      * G. Marsaglia, as described by Donald E. Knuth in <i>The Art of      * Computer Programming</i>, Volume 2: <i>Seminumerical Algorithms</i>,      * section 3.4.1, subsection C, algorithm P. Note that it generates two     * independent values at the cost of only one call to <tt>Math.log</tt>      * and one call to <tt>Math.sqrt</tt>.      *     * @return  the next pseudorandom, Gaussian ("normally") distributed     *          <code>double</code> value with mean <code>0.0</code> and     *          standard deviation <code>1.0</code> from this random number     *          generator's sequence.     */    synchronized public double nextGaussian() {        // See Knuth, ACP, Section 3.4.1 Algorithm C.        if (haveNextNextGaussian) {    	    haveNextNextGaussian = false;    	    return nextNextGaussian;    	} else {            double v1, v2, s;    	    do {                 v1 = 2 * nextDouble() - 1; // between -1 and 1            	v2 = 2 * nextDouble() - 1; // between -1 and 1                 s = v1 * v1 + v2 * v2;    	    } while (s >= 1 || s == 0);    	    double multiplier = Math.sqrt(-2 * Math.log(s)/s);    	    nextNextGaussian = v2 * multiplier;    	    haveNextNextGaussian = true;    	    return v1 * multiplier;        }    }}     

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?