Random类产生随机数
2013-10-20 09:37
302 查看
Random 类作为JAVA中用于产生的随机数 ,new Random(10) :10是种子数。
注意:Random 的一个特点是:相同种子数的Random对象,对应相同次数生成的随机数字是完全相同的
验证代码:
Random r1 = new Random(10);
Random r2 = new Random(10);
for(int i = 0;i < 4;i++){
System.out.println(r1.nextInt(5));
}
System.out.println("++++++++++++++++++++++");
for(int i = 0;i < 4;i++){
System.out.println(r2.nextInt(5));
}
结果:r1 产生的随机数
3
0
3
0
++++++++++++++++++++++
3 r2产生的随机数
0
3
0
换成:
System.out.println(r1.nextDouble(5))System.out.println(r2.nextDouble(5))
结果:
0.7304302967434272
0.2578027905957804
0.059201965811244595
0.24411725056425315
++++++++++++++++++++++
0.7304302967434272
0.2578027905957804
0.059201965811244595
0.24411725056425315
分析: 虽然说是随机数发生器,但是还是按照某种算法一步一步执行下去的,种子数一定算法一样那么同一时刻的产生的数值当然该一样了!!
* @param seed the initial seed
* @see #setSeed(long)
*/
++++++++++++++++++带种子数的构造方法+++++++++++++
public Random(long seed) {
if (getClass() == Random.class)
this.seed = new AtomicLong(initialScramble(seed));
else {
// subclass might have overriden setSeed
this.seed = new AtomicLong();
setSeed(seed);
}
}
++++++++++++++netInt方法带参数的那个源码++++++++++++
* @since 1.2
*/
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;
}
可见Random的种子要求 大于0 的 。。。
+++++++++++++++nextDoublef方法实现+++++++++++
public double nextDouble() {
return (((long)(next(26)) << 27) + next(27))
/ (double)(1L << 53);
}
+++++++++++++++nextFloat方法实现+++++++++++++
public float nextFloat() {
return next(24) / ((float)(1 << 24));
}
+++++++++++++++++nextInt方法实现:++++++++++
public int nextInt() {
return next(32);
}
可见所有的随机数产生都和一个叫 next方法有关,这个方法是这样的:
* @since 1.1
*/
protected int next(int bits) {
long oldseed, nextseed;
AtomicLong seed = this.seed;
do {
oldseed = seed.get();
nextseed = (oldseed * multiplier + addend) & mask;
} while (!seed.compareAndSet(oldseed, nextseed));
return (int)(nextseed >>> (48 - bits));
}
拓展:
Math类中也有一个random方法,该random方法的工作是生成一个[0,1.0)区间的随机小数。
通过阅读Math类的源代码可以发现,Math类中的random方法就是直接调用Random类中的nextDouble方法实现的。
* @see Random#nextDouble()
*/
public static double random() {
Random rnd = randomNumberGenerator;
if (rnd == null) rnd = initRNG();
return rnd.nextDouble();
}
注意:Random 的一个特点是:相同种子数的Random对象,对应相同次数生成的随机数字是完全相同的
验证代码:
Random r1 = new Random(10);
Random r2 = new Random(10);
for(int i = 0;i < 4;i++){
System.out.println(r1.nextInt(5));
}
System.out.println("++++++++++++++++++++++");
for(int i = 0;i < 4;i++){
System.out.println(r2.nextInt(5));
}
结果:r1 产生的随机数
3
0
3
0
++++++++++++++++++++++
3 r2产生的随机数
0
3
0
换成:
System.out.println(r1.nextDouble(5))System.out.println(r2.nextDouble(5))
结果:
0.7304302967434272
0.2578027905957804
0.059201965811244595
0.24411725056425315
++++++++++++++++++++++
0.7304302967434272
0.2578027905957804
0.059201965811244595
0.24411725056425315
分析: 虽然说是随机数发生器,但是还是按照某种算法一步一步执行下去的,种子数一定算法一样那么同一时刻的产生的数值当然该一样了!!
* @param seed the initial seed
* @see #setSeed(long)
*/
++++++++++++++++++带种子数的构造方法+++++++++++++
public Random(long seed) {
if (getClass() == Random.class)
this.seed = new AtomicLong(initialScramble(seed));
else {
// subclass might have overriden setSeed
this.seed = new AtomicLong();
setSeed(seed);
}
}
++++++++++++++netInt方法带参数的那个源码++++++++++++
* @since 1.2
*/
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;
}
可见Random的种子要求 大于0 的 。。。
+++++++++++++++nextDoublef方法实现+++++++++++
public double nextDouble() {
return (((long)(next(26)) << 27) + next(27))
/ (double)(1L << 53);
}
+++++++++++++++nextFloat方法实现+++++++++++++
public float nextFloat() {
return next(24) / ((float)(1 << 24));
}
+++++++++++++++++nextInt方法实现:++++++++++
public int nextInt() {
return next(32);
}
可见所有的随机数产生都和一个叫 next方法有关,这个方法是这样的:
* @since 1.1
*/
protected int next(int bits) {
long oldseed, nextseed;
AtomicLong seed = this.seed;
do {
oldseed = seed.get();
nextseed = (oldseed * multiplier + addend) & mask;
} while (!seed.compareAndSet(oldseed, nextseed));
return (int)(nextseed >>> (48 - bits));
}
拓展:
Math类中也有一个random方法,该random方法的工作是生成一个[0,1.0)区间的随机小数。
通过阅读Math类的源代码可以发现,Math类中的random方法就是直接调用Random类中的nextDouble方法实现的。
* @see Random#nextDouble()
*/
public static double random() {
Random rnd = randomNumberGenerator;
if (rnd == null) rnd = initRNG();
return rnd.nextDouble();
}
相关文章推荐
- linux 随机数的产生/dev/random 和/dev/urandom
- java Math.random()随机数的产生
- .net中使用Random()产生一个随机数
- java中Random(long seed)方法与rRandom()方法的使用产生随机数
- Random类产生随机数,注意是从0开始的,否则需要进行相关范围调整计算
- 让random在极短时间内产生的随机数不相同
- c# Random快速连续产生相同随机数的解决方案
- <stdlib.h>中的随机数产生函数rand,random,srand,srandom的一些知识
- 原来c++中没有random()函数,而是用rand函数实现产生随机数的功能
- Java中利用Math.random()产生服从泊松分布的随机数
- 产生随机数之srandom()与random()的应用
- 使用Random产生100个无重复随机数,使用Set存储和使用位图存储的效率对比
- c# Random太快产生的随机数会重复
- java7新特性——使用ThreadLocalRandom产生并发随机数
- Random产生随机数与Math.random()产生随机数的比较
- ORACLE 如何产生一个随机数:DBMS_RANDOM
- java7新特性——使用ThreadLocalRandom产生并发随机数
- C#--利用Random类产生10个[10,99]之间的随机数,并将这10个随机数在列表框中显示出来,每个数占一项。用户选择某项后,在右边标签中显示所选内容
- ORACLE 如何产生一个随机数:DBMS_RANDOM