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


<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)也就会不同。
总之,种子和范围是相关联的。
一个种子对应一个范围内的一个固定的随机数!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值