random.html

来自「j2se5-api-zh,java文档的中文版本」· HTML 代码 · 共 622 行 · 第 1/2 页

HTML
622
字号
<DD><DL><DT><B>参数:</B><DD><CODE>seed</CODE> - 初始种子。</DL></DD></DL><HR><A NAME="next(int)"><!-- --></A><H3>next</H3><PRE>protected int <B>next</B>(int&nbsp;bits)</PRE><DL><DD>生成下一个伪随机数。当此数被所有其他方法使用时,子类应该重写此数。<p><tt>next</tt> 的常规协定是它返回一个 <tt>int</tt> 值,并且如果参数位处于 <tt>1</tt> 和 <tt>32</tt>(包括)之间,那么返回值的多数低位都将(大致)是单独选择的位值,每个位值是 <tt>0</tt> 或 <tt>1</tt> 的机会(大致)相等。<tt>Random</tt> 类按如下方式实现 <tt>next</tt> 方法: <blockquote><pre> synchronized protected int next(int bits) {       seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);       return (int)(seed >>> (48 - bits)); }</pre></blockquote>这是一个线性同余伪随机数生成器,由 D. H. Lehmer 定义,Donald E. Knuth 在《<i>The Art of Computer Programming,</i> Volume 2: <i>Seminumerical Algorithms</i>》的第 3.2.1 节中进行了描述。<P><DD><DL></DL></DD><DD><DL><DT><B>参数:</B><DD><CODE>bits</CODE> - 随机位。<DT><B>返回:</B><DD>随机数生成器序列的下一个伪随机值。<DT><B>从以下版本开始:</B></DT>  <DD>JDK1.1</DD></DL></DD></DL><HR><A NAME="nextBytes(byte[])"><!-- --></A><H3>nextBytes</H3><PRE>public void <B>nextBytes</B>(byte[]&nbsp;bytes)</PRE><DL><DD>生成随机字节并将其置于用户提供的字节数组中。所生成的随机字节数等于该字节数组的长度。<P><DD><DL></DL></DD><DD><DL><DT><B>参数:</B><DD><CODE>bytes</CODE> - 放入随机字节的非 null 字节数组。<DT><B>从以下版本开始:</B></DT>  <DD>JDK1.1</DD></DL></DD></DL><HR><A NAME="nextInt()"><!-- --></A><H3>nextInt</H3><PRE>public int <B>nextInt</B>()</PRE><DL><DD>返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 <code>int</code> 值。<tt>nextInt</tt> 的常规协定是伪随机地生成并返回一个 <tt>int</tt> 值。所有 2<font size="-1"><sup>32</sup></font> 个可能 <tt>int</tt> 值的生成概率(大致)相同。<tt>Random</tt> 类按如下方式实现 <tt>nextInt</tt> 方法: <blockquote><pre> public int nextInt() {  return next(32); }</pre></blockquote><P><DD><DL></DL></DD><DD><DL><DT><B>返回:</B><DD>下一个伪随机数,它是此随机数生成器的序列中均匀分布的 <code>int</code> 值。</DL></DD></DL><HR><A NAME="nextInt(int)"><!-- --></A><H3>nextInt</H3><PRE>public int <B>nextInt</B>(int&nbsp;n)</PRE><DL><DD>返回一个伪随机数,它是从此随机数生成器的序列中取出的、在 0(包括)和指定值(包括)之间均匀分布的 <tt>int</tt>值。<tt>nextInt</tt> 的常规协定是伪随机地生成并返回指定范围中的一个 <tt>int</tt> 值。所有 <tt>n</tt> 个可能 <tt>int</tt> 值的生成概率(大致)相同。<tt>Random</tt> 类按如下方式实现 <tt>nextInt(int n)</tt> 方法: <blockquote><pre> 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; } </pre></blockquote> <p>前面的描述中使用了不明确的词“大致”,只是因为 next 方法大致为一个单独选择位的公正来源。如果它是一个随机选择位的最佳来源,那么给出的算法应该从起始范围开始完全一致地选择 <tt>int</tt> 值。 <p>但此算法稍微有些复杂。它拒绝那些会导致不均匀分布的值(由于 2^31 无法被 n 整除)。某个值被拒绝的概率取决于 n。最坏的情况是 n=2^30+1,拒绝的概率是 1/2,循环终止前的预计迭代次数是 2。 <p>此算法特别对待 n 是 2 次幂的情况:它从基础的伪随机数生成器中返回正确的高位数。在不是特殊处理的情况中,将返回正确的<i>低</i> 位数。众所周知,线性同余伪随机数生成器(比如此类所实现的)在其低位的值序列中有 short periods。因此,如果 n 是 2 次幂(幂值较小),则这种特殊情况会导致对此方法的后续调用会返回其长度大大增加的值序列。<P><DD><DL></DL></DD><DD><DL><DT><B>参数:</B><DD><CODE>n</CODE> - 所返回随机数的范围。必须为正数。<DT><B>返回:</B><DD>一个伪随机数,处于 0(包括)和 n(包括)之间均匀分布的 <tt>int</tt> 值。<DT><B>抛出:</B><DD><CODE><A HREF="../lang/IllegalArgumentException.html" title="java.lang 中的类">IllegalArgumentException</A></CODE> - n 不是正数。<DT><B>从以下版本开始:</B></DT>  <DD>1.2</DD></DL></DD></DL><HR><A NAME="nextLong()"><!-- --></A><H3>nextLong</H3><PRE>public long <B>nextLong</B>()</PRE><DL><DD>返回下一个伪随机数,它是从此随机数生成器的序列中取出的、均匀分布的 <code>long</code> 值。<tt>nextLong</tt> 的常规协定是伪随机地生成并返回一个 long 值。所有 2<font size="-1"><sup>64</sup></font> 个可能 <tt>long</tt> 值的生成概率(大致)相同。<tt>Random</tt> 类按如下方式实现 <tt>nextLong</tt> 方法: public long nextLong() {       return ((long)next(32) << 32) + next(32); }</pre></blockquote><P><DD><DL></DL></DD><DD><DL><DT><B>返回:</B><DD>下一个伪随机数,它是此随机数生成器的序列中均匀分布的 <code>long</code> 值。</DL></DD></DL><HR><A NAME="nextBoolean()"><!-- --></A><H3>nextBoolean</H3><PRE>public boolean <B>nextBoolean</B>()</PRE><DL><DD>返回下一个伪随机数,它是从此随机数生成器的序列中取出的、均匀分布的 <code>boolean</code> 值。<tt>nextBoolean</tt> 的常规协定是伪随机地生成并返回一个 <tt>boolean</tt> 值。值 <code>true</code> 和 <code>false</code> 的生成概率(大致)相同。<tt>Random</tt> 类按如下方式实现 <tt>nextBoolean</tt> 方法: <blockquote><pre> public boolean nextBoolean() {return next(1) != 0;} </pre></blockquote><P><DD><DL></DL></DD><DD><DL><DT><B>返回:</B><DD>下一个伪随机数,它是此随机数生成器的序列中均匀分布的 <code>boolean</code> 值。<DT><B>从以下版本开始:</B></DT>  <DD>1.2</DD></DL></DD></DL><HR><A NAME="nextFloat()"><!-- --></A><H3>nextFloat</H3><PRE>public float <B>nextFloat</B>()</PRE><DL><DD>返回下一个伪随机数,它是从此随机数生成器的序列中取出的、在 <code>0.0</code> 和 <code>1.0</code> 之间均匀分布的 <code>float</code> 值。<p><tt>nextFloat</tt> 的常规协定是伪随机地生成并返回一个从 <tt>0.0f</tt>(包括)到 <tt>1.0f</tt>(包括)范围内均匀选择(大致)的 <tt>float</tt> 值。所有 2<font size="-1"><sup>24</sup></font> 个可能 <tt>float</tt> 值(其形式为 <i>m&nbsp;x&nbsp;</i>2<font size="-1"><sup>-24</sup></font>,其中 <i>m</i> 是一个小于 2<font size="-1"><sup>24</sup></font> 的正整数)的生成概率(大致)相同。<tt>Random</tt> 类按如下方式实现 <tt>nextFloat</tt> 方法: <blockquote><pre> public float nextFloat() {      return next(24) / ((float)(1 << 24)); }</pre></blockquote>前面的描述中使用了不明确的词“大致”,只是因为 next 方法大致为一个单独选择位的公正来源。如果它是一个随机选择位的最佳来源,那么给出的算法应该从起始范围开始完全一致地选择 <tt>float</tt> 值。<p>[在 Java 的早期版本中,计算的结果是错误的,因为: <blockquote><pre> return next(30) / ((float)(1 << 30));</pre></blockquote>这可能看似等效(如果不是更好的话),但实际上由于浮点数舍入中的偏差,它会导致轻微的不均匀性:有效数的低位更可能是 0 而不是 1。]<P><DD><DL></DL></DD><DD><DL><DT><B>返回:</B><DD>下一个伪随机数,它是从此随机数生成器的序列中取出的、在 <code>0.0</code> 和 <code>1.0</code> 之间均匀分布的 <code>float</code> 值。</DL></DD></DL><HR><A NAME="nextDouble()"><!-- --></A><H3>nextDouble</H3><PRE>public double <B>nextDouble</B>()</PRE><DL><DD>返回下一个伪随机数,它是从此随机数生成器的序列中取出的、在 <code>0.0</code> 和 <code>1.0</code>之间均匀分布的 <code>double</code> 值。 <p><tt>nextDouble</tt> 的常规协定是伪随机地生成并返回一个从 <tt>0.0d</tt>(包括)到 <tt>1.0d</tt>(包括)范围内均匀选择(大致)的 <tt>double</tt> 值。所有 2<font size="-1"><sup>53</sup></font> 个可能 <tt>float</tt> 值(其形式为 <i>m&nbsp;x&nbsp;</i>2<font size="-1"><sup>-53</sup></font>,其中 <i>m</i> 是一个小于 2<font size="-1"><sup>53</sup></font> 的正整数)的生成概率(大致)相同。<tt>Random</tt> 类按如下方式实现 <tt>nextDouble</tt> 方法:<blockquote><pre>public double nextDouble() {       return (((long)next(26) << 27) + next(27))           / (double)(1L << 53); }</pre></blockquote><p>前面的描述中使用了不明确的词“大致”,只是因为 <tt>next</tt> 方法大致为一个单独选择位的公正来源。如果它是一个随机选择位的最佳来源,那么给出的算法应该从起始范围开始完全一致地选择 <tt>double</tt> 值。 <p>[在 Java 的早期版本中,计算的结果是错误的,因为: <blockquote><pre>  return (((long)next(27) << 27) + next(27))      / (double)(1L << 54);</pre></blockquote>这可能看似等效(如果不是更好的话),但实际上由于浮点数舍入中的偏差,它会引入较大的不均匀性:有效数的低位可能出现的 0 是 1 的三倍!这种不均匀性在实践中可能没什么关系,但是我们应该争取完美。]<P><DD><DL></DL></DD><DD><DL><DT><B>返回:</B><DD>下一个伪随机数,它是从此随机数生成器的序列中取出的、在 <code>0.0</code> 和 <code>1.0</code> 之间均匀分布的 <code>double</code> 值。</DL></DD></DL><HR><A NAME="nextGaussian()"><!-- --></A><H3>nextGaussian</H3><PRE>public double <B>nextGaussian</B>()</PRE><DL><DD>返回下一个伪随机数,它是从此随机数生成器的序列中取出的、呈高斯(“正常地”)分布的 <code>double</code> 值,其平均值是 <code>0.0</code>,标准偏差是 <code>1.0</code>。 <p><tt>nextGaussian</tt> 的常规协定是伪随机地生成并返回一个 <tt>double</tt> 值,该值从(大致)从具有平均值 <tt>0.0</tt> 和标准偏差 <tt>1.0</tt> 的常规标准分布中选择。<tt>Random</tt> 类按如下方式实现 <tt>nextGaussian</tt> 方法: <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 &gt;= 1 || s == 0);            double multiplier = Math.sqrt(-2 * Math.log(s)/s);            nextNextGaussian = v2 * multiplier;            haveNextNextGaussian = true;            return v1 * multiplier;    } }</pre></blockquote>这使用了 G. E. P. Box、M. E. Muller 和 G. Marsaglia 的 <i>polar method</i>,该方法在 Donald E. Knuth 的《<i>The Art of Computer Programming</i>, Volume 2:<i>Seminumerical Algorithms</i>》的第 3.4.1 节,小节 C,算法 P 中进行了描述。注意,对于一次调用 <tt>Math.log</tt> 和一次调用 <tt>Math.sqrt</tt> 而言,它生成了两个单独的值。<P><DD><DL></DL></DD><DD><DL><DT><B>返回:</B><DD>下一个伪随机数,它是从此随机数生成器的序列中取出的、呈高斯(“正常地”)分布的 <code>double</code> 值,其平均值是 <code>0.0</code>,标准偏差是 <code>1.0</code>。</DL></DD></DL><!-- ========= END OF CLASS DATA ========= --><HR><!-- ======= START OF BOTTOM NAVBAR ====== --><A NAME="navbar_bottom"><!-- --></A><A HREF="#skip-navbar_bottom" title="跳过导航链接"></A><TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY=""><TR><TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1"><A NAME="navbar_bottom_firstrow"><!-- --></A><TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">  <TR ALIGN="center" VALIGN="top">  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../overview-summary.html"><FONT CLASS="NavBarFont1"><B>概述</B></FONT></A>&nbsp;</TD>  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>软件包</B></FONT></A>&nbsp;</TD>  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>类</B></FONT>&nbsp;</TD>  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="class-use/Random.html"><FONT CLASS="NavBarFont1"><B>使用</B></FONT></A>&nbsp;</TD>  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>树</B></FONT></A>&nbsp;</TD>  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>已过时</B></FONT></A>&nbsp;</TD>  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../index-files/index-1.html"><FONT CLASS="NavBarFont1"><B>索引</B></FONT></A>&nbsp;</TD>  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../help-doc.html"><FONT CLASS="NavBarFont1"><B>帮助</B></FONT></A>&nbsp;</TD>  </TR></TABLE></TD><TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM><b>Java<sup><font size=-2>TM</font></sup>&nbsp;2&nbsp;Platform<br>Standard&nbsp;Ed. 5.0</b></EM></TD></TR><TR><TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">&nbsp;<A HREF="Queue.html" title="java.util 中的接口"><B>上一个类</B></A>&nbsp;&nbsp;<A HREF="RandomAccess.html" title="java.util 中的接口"><B>下一个类</B></A></FONT></TD><TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">  <A HREF="../../index.html@java_2Futil_2FRandom.html" target="_top"><B>框架</B></A>  &nbsp;&nbsp;<A HREF="Random.html" target="_top"><B>无框架</B></A>  &nbsp;&nbsp;<SCRIPT type="text/javascript">  <!--  if(window==top) {    document.writeln('<A HREF="../../allclasses-noframe.html"><B>所有类</B></A>');  }  //--></SCRIPT><NOSCRIPT>  <A HREF="../../allclasses-noframe.html"><B>所有类</B></A></NOSCRIPT></FONT></TD></TR><TR><TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">  摘要:&nbsp;嵌套&nbsp;|&nbsp;字段&nbsp;|&nbsp;<A HREF="#constructor_summary">构造方法</A>&nbsp;|&nbsp;<A HREF="#method_summary">方法</A></FONT></TD><TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">详细信息:&nbsp;字段&nbsp;|&nbsp;<A HREF="#constructor_detail">构造方法</A>&nbsp;|&nbsp;<A HREF="#method_detail">方法</A></FONT></TD></TR></TABLE><A NAME="skip-navbar_bottom"></A><!-- ======== END OF BOTTOM NAVBAR ======= --><HR><font size="-1"><a href="../../../../../../../../java.sun.com/cgi-bin/bugreport.cgi">提交错误或意见</a><br>有关更多的 API 参考资料和开发人员文档,请参阅 <a href="../../../../../../../../java.sun.com/j2se/1.5.0/docs/relnotes/devdocs-vs-specs.html">Java 2 SDK SE 开发人员文档</a>。该文档包含更详细的、面向开发人员的描述,以及总体概述、术语定义、使用技巧和工作代码示例。 <p>版权所有 2004 Sun Microsystems, Inc. 保留所有权利。 请遵守<a href="../../../../../../../../java.sun.com/j2se/1.5.0/docs/relnotes/license.html">许可证条款</a>。另请参阅<a href="../../../../../../../../java.sun.com/docs/redist.html">文档重新分发政策</a>。</font></BODY></HTML>

⌨️ 快捷键说明

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