属于包:java.util.Random
Random:随机类型
1、属性。
无。
2、构造函数。
Random() :创建一个新的随机数发生器。
Random(long seed) :用一个种子(长整型)创建一个随机数发生器。
3、方法。
说明:
1. 所有方法均为public;
2. 书写格式:[修饰符] <返回类型> <方法名([参数列表])>
如:
static int parseInt(String s) 表示:此方法(parseInt)为类方法(static),返回类型为(int),方法所需参数为String类型。
2. boolean nextBoolean() :返回下一个从随机发生器的系列中得到的均匀分布的布尔值。
3. void nextBytes(byte[] bytes) :产生随机字节数组放到指定的数组中。
4. double nextDouble() :返回下一个从随机发生器的系列中得到的均匀分布的0.0到1.0的双精度类型值。
5. float nextFloat() :返回下一个从随机发生器的系列中得到的均匀分布的0.0到1.0的浮点类型值。
6. double nextGaussian() :返回下一个从随机发生器的系列中得到的符合均匀分布的0.0的平均数到1.0方差的高斯分布双精度类型值。
7. int nextInt() :返回下一个从随机发生器的系列中得到的均匀分布的整型值。
8. int nextInt(int n) :返回下一个从随机发生器的系列中得到的均匀分布的0到指定整型数(n)之间的整型值。
9. long nextLong() :返回下一个从随机发生器的系列中得到的均匀分布的长整型值。
10. void setSeed(long seed) :设置随机数发生器的种子为一个长整型数。
来源:http://blog.csdn.net/u012099869/article/details/50394644
Random:随机类型
1、属性。
无。
2、构造函数。
Random() :创建一个新的随机数发生器。
Random(long seed) :用一个种子(长整型)创建一个随机数发生器。
3、方法。
说明:
1. 所有方法均为public;
2. 书写格式:[修饰符] <返回类型> <方法名([参数列表])>
如:
static int parseInt(String s) 表示:此方法(parseInt)为类方法(static),返回类型为(int),方法所需参数为String类型。
2. boolean nextBoolean() :返回下一个从随机发生器的系列中得到的均匀分布的布尔值。
3. void nextBytes(byte[] bytes) :产生随机字节数组放到指定的数组中。
4. double nextDouble() :返回下一个从随机发生器的系列中得到的均匀分布的0.0到1.0的双精度类型值。
5. float nextFloat() :返回下一个从随机发生器的系列中得到的均匀分布的0.0到1.0的浮点类型值。
6. double nextGaussian() :返回下一个从随机发生器的系列中得到的符合均匀分布的0.0的平均数到1.0方差的高斯分布双精度类型值。
7. int nextInt() :返回下一个从随机发生器的系列中得到的均匀分布的整型值。
8. int nextInt(int n) :返回下一个从随机发生器的系列中得到的均匀分布的0到指定整型数(n)之间的整型值。
9. long nextLong() :返回下一个从随机发生器的系列中得到的均匀分布的长整型值。
10. void setSeed(long seed) :设置随机数发生器的种子为一个长整型数。
来源:http://www.360doc.com/content/06/1214/11/15458_293485.shtml
------------------------------------------------------------------------------------------------------------------------
random.nextInt()与Math.random()基础用法
1、来源
random.nextInt() 为 java.util.Random类中的方法;
Math.random() 为 java.lang.Math 类中的静态方法。
2、用法
产生0-n的伪随机数(伪随机数参看最后注解):
// 两种生成对象方式:带种子和不带种子(两种方式的区别见注解)
Random random = new Random();
Integer res = random.nextInt(n);
Integer res = (int)(Math.random() * n);
3、jdk源码
// random.nextInt(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;
}
// Math.random()
public static double random() {
Random rnd = randomNumberGenerator;
// 第一次调用,生成一个随机数生成器
if (rnd == null) rnd = initRNG();
return rnd.nextDouble();
}
// 生成的方法为同步的,线程安全
private static synchronized Random initRNG() {
Random rnd = randomNumberGenerator;
return (rnd == null) ? (randomNumberGenerator = new Random()) : rnd;
}
// 该方法为 Random 类中的方法
public double nextDouble() {
return (((long)(next(26)) << 27) + next(27))
/ (double)(1L << 53);
}
4、总结
- Math.random() 方法生成[0, 1)范围内的double类型随机数;Random类中的nextXxxx系列方法生成0-n的随机数;
- Math.random() 线程安全,多线程环境能被调用;
- 如无特殊需求,则使用(int)(Math.random()*n)的方式生成随机数即可。
5、注:何谓伪随机数
伪随机既有规则的随机,Random类中的随机算法就是伪随机。
具体表现为:相同种子数的Random对象生成的随机数序列相同:
@Test
public void createProjectNo() {
Random r1 = new Random(100);
Random r2 = new Random(100);
for (int i = 0; i < 100; i ++) {
System.out.println(r1.nextInt(10)+", "+r2.nextInt(10));
}
}
结果为:
如不想生成相同的随机数序列,则应只使用一个Random类。而Math类中的随机数生成器 randomNumberGenerator 对象为静态的,可考虑使用。
6、注:Random类的两种构造方法区别
1、 源码
public Random() {
this(seedUniquifier() ^ System.nanoTime());
}
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);
}
}
2、区别
从源码中可以看到,未定义种子的构造方法里,使用当前系统时间相关的一个数字作为种子数,该种子数只作为随机算法的起源数字,与生成的随机数区间无关系。