⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 random.java

📁 java源代码 请看看啊 提点宝贵的意见
💻 JAVA
📖 第 1 页 / 共 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;        }    }    /**     * Serializable fields for Random.     *     * @serialField    seed long;     *              seed for random computations     * @serialField    nextNextGaussian double;     *              next Gaussian to be returned     * @serialField      haveNextNextGaussian boolean     *              nextNextGaussian is valid     */    private static final ObjectStreamField[] serialPersistentFields = {        new ObjectStreamField("seed", Long.TYPE),        new ObjectStreamField("nextNextGaussian", Double.TYPE),        new ObjectStreamField("haveNextNextGaussian", Boolean.TYPE)        };    /**     * Reconstitute the <tt>Random</tt> instance from a stream (that is,     * deserialize it). The seed is read in as long for     * historical reasons, but it is converted to an AtomicLong.     */    private void readObject(java.io.ObjectInputStream s)        throws java.io.IOException, ClassNotFoundException {        ObjectInputStream.GetField fields = s.readFields();        long seedVal;        seedVal = (long) fields.get("seed", -1L);        if (seedVal < 0)          throw new java.io.StreamCorruptedException(                              "Random: invalid seed");        seed = AtomicLong.newAtomicLong(seedVal);        nextNextGaussian = fields.get("nextNextGaussian", 0.0);        haveNextNextGaussian = fields.get("haveNextNextGaussian", false);    }    /**     * Save the <tt>Random</tt> instance to a stream.     * The seed of a Random is serialized as a long for     * historical reasons.     *     */    synchronized private void writeObject(ObjectOutputStream s) throws IOException {        // set the values of the Serializable fields        ObjectOutputStream.PutField fields = s.putFields();        fields.put("seed", seed.get());        fields.put("nextNextGaussian", nextNextGaussian);        fields.put("haveNextNextGaussian", haveNextNextGaussian);        // save them        s.writeFields();    }}     

⌨️ 快捷键说明

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