写出如下代码的运行结果和原因
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();
}
}
}
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();
}
}
}
具体啥关系,等待高人
无论怎么next都是产生同样的伪随机数
返回一个伪随机数,它是从此随机数生成器的序列中取出的、在 0(包括)和指定值(不包括)之间均匀分布的 int值。nextInt 的常规协定是伪随机地生成并返回指定范围中的一个 int 值。所有 n 个可能 int 值的生成概率(大致)相同。Random 类按如下方式实现 nextInt(int n) 方法:
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;
}
前面的描述中使用了不明确的词“大致”,只是因为 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 不是正数。
public Random(long seed)使用单个 long 种子创建一个新随机数生成器:
public Random(long seed) { setSeed(seed); }next 方法使用它来保存随机数生成器的状态。 参数:
seed - 初始种子。
另请参见:
setSeed(long)
方法详细信息 setSeed
public void setSeed(long seed)使用单个 long 种子设置此随机数生成器的种子。setSeed 的常规协定是它更改此随机数生成器对象的状态,使其状态好像是刚刚使用参数 seed 作为种子创建它的状态一样。Random 类按如下方式实现 setSeed 方法:
synchronized public void setSeed(long seed) {
this.seed = (seed ^ 0x5DEECE66DL) & ((1L << 48) - 1);
haveNextNextGaussian = false;
}由 Random 类实现的 setSeed 恰好只使用 48 位的给定种子。但是,通常重写方法可能使用 long 参数的所有 64 位作为种子值。 注:尽管种子值是一个基本的 AtomicLong,但仍必须对此方法同步,确保 haveNextNextGaussian 的语义正确。 this.seed = (seed ^ 0x5DEECE66DL) & ((1L << 48) - 1);好复杂的算法!
如果没有种子,Rondom rd=new Rondom()则产生的随机数就是不断变化的
与 Random#nextInt(int) 方法采用的随机算法有关,算法在 API
上有描述,但是为什么要这样做,呵呵,这得由数学理论来证明是
有效可行的,这已经远远地超出了 Java 的范围,应该属于计算数
学的范围了。
如果没有种子:
----------------------------------------------------
public class Test { static void test() { Random r = new Random();
System.out.println(r.nextInt(3));
} public static void main(String[] args) { for (int i = 0; i < 10; i++) {
test();
}
}
}
----------------------------------------------------
打印出的结果就会不同了。
因为没有种子的话,程序会取当前日期的XXX毫秒数(记不清了)来
作为种子,所以每次执行种子都会不同,这些不同的种子对应3这个
范围内的随机数(0或1或2)也就会不同。
总之,种子和范围是相关联的。
一个种子对应一个范围内的一个固定的随机数!
原因: 在思索ing..........
上面的朋友不是解释的很清楚.
所以我们在产生产随机数时就
Random r = new Random(System.currentTimeMillis());这样写了.===========================================
不知道说的对不对.还请朋友们给予纠正.
r.nextInt(n) n不同产生的数不同,
Random r = new Random(1);
System.out.println(r.nextInt(3));
那出的是:0
如果是:
Random r = new Random(2);
System.out.println(r.nextInt(3));
那出的是:1
如果是:
Random r = new Random(3);
System.out.println(r.nextInt(3));
那出的是:2
static void test() {
Random r = new Random(2008);
System.out.println(r.nextInt(3));
System.out.println(r.nextInt(3));
System.out.println(r.nextInt(3));
} public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
test();
}
}
}-------------------------------------------------------------
import java.util.Random;public class T {
static void test() {
Random r = new Random(2008);
System.out.println(r.nextInt(2008));
System.out.println(r.nextInt(2008));
System.out.println(r.nextInt(2008));
} public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
test();
}
}
}
你说的时候应该测试下
这样对你自己也有好处
` 你那样写产生出来的也是一样的`
System.currentTimeMillis() 这个你把他打印出来就会发现得到的也是一个固定的值`
应该是 不写 才对``
nextInt(3)
则会产生以下的随机数序列:1
2
2
1
2
0每次以2008为种子重新生成Random对象,第一个产生的随机数为1,无论调用多少次,产生的第一个伪随机数总是伪1. 而不设定种子的情况下,默认的构造器会以当前的系统时间为种子来构造随机数序列,所以每次生成的随机数序列也都是不同的。
n不同产生的数的范围不同 如果 你的n=1的话产生的数全部都为0,跟need就没有关系了
这么理解对吗?