您的位置:首页 > 编程语言 > Java开发

关于Random(47)和nextint(3)的问题

2015-12-07 17:25 288 查看

<code>import java.util.Random;
public class T {

  static void test() {

    Random r = new Random(2008);

    System.out.println(r.nextInt(3));

  }
  public static void main(String[] args) {

    for (int i = 0; i < 10; i++) {

      test();

    }

  }

}
</code>
不知道大家知道这个输出结果不,10个1。。。还不变的。
不过首先要说下,Random()是随机生成数字。nextint(n)是大于等于0,小于n。
所以,不管怎么说,也应该是0,1,2随机生成啊。
我们在看个代码:
<code>

public class T {

  public static void main(String[] args) {
     Random r = new Random(2008);

    for (int i = 0; i < 10; i++) {

     System.out.println(r.nextInt(3));

    }

  }

}</code>
输出
我去,,,怎么变了。。
不过细心的你也许也发现了,稳定输出这个,这个虽然随机了,但是不管怎么再编译还是这个结果。又是为什么呢?
public int nextInt(int n)

返回一个伪随机数,它是从此随机数生成器的序列中取出的、在 0(包括)和指定值(不包括)之间均匀分布的 int值。nextInt 的常规协定是伪随机地生成并返回指定范围中的一个 int 值。所有 n 个可能 int 值的生成概率(大致)相同。Random 类按如下方式实现 nextInt(int n) 方法:

<code> 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;

 }

 </code>

前面的描述中使用了不明确的词“大致”,只是因为 next 方法大致为一个单独选择位的公正来源。如果它是一个随机选择位的最佳来源,那么给出的算法应该从起始范围开始完全一致地选择 int 值。

但此算法稍微有些复杂。它拒绝那些会导致不均匀分布的值(由于 2^31 无法被 n 整除)。某个值被拒绝的概率取决于 n。最坏的情况是 n=2^30+1,拒绝的概率是 1/2,循环终止前的预计迭代次数是 2。

此算法特别对待 n 是 2 次幂的情况:它从基础的伪随机数生成器中返回正确的高位数。在不是特殊处理的情况中,将返回正确的低 位数。众所周知,线性同余伪随机数生成器(比如此类所实现的)在其低位的值序列中有 short periods。因此,如果 n 是 2 次幂(幂值较小),则这种特殊情况会导致对此方法的后续调用会返回其长度大大增加的值序列。

参数:

n - 所返回随机数的范围。必须为正数。

返回:

一个伪随机数,处于 0(包括)和 n(包括)之间均匀分布的 int 值。

抛出:

IllegalArgumentException - n 不是正数。

一句话,其中涉及到很多数学知识。我们大概明白表层就好。。。哈哈哈哈哈,而且还要知道那2个Random初始化顺序决定了输出结果

没有种子的话,程序会取当前日期的XXX毫秒数(记不清了)来

作为种子,所以每次执行种子都会不同,这些不同的种子对应3这个

范围内的随机数(0或1或2)也就会不同。

总之,种子和范围是相关联的。

一个种子对应一个范围内的一个固定的随机数!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  random java