random.nextInt()与Math.random()基础用法
来源:互联网 发布:tensorflow finetune 编辑:程序博客网 时间:2024/06/05 19:55
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对象生成的随机数序列相同:
@Testpublic 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、区别
从源码中可以看到,未定义种子的构造方法里,使用当前系统时间相关的一个数字作为种子数,该种子数只作为随机算法的起源数字,与生成的随机数区间无关系。
0 0
- random.nextInt()与Math.random()基础用法
- random.nextInt()与Math.random()基础用法
- random.nextInt()与Math.random()基础用法
- random.nextInt()与Math.random()基础用法
- random.nextInt()与Math.random()区别
- java Random.nextInt()与Math.random()的比较
- Random.nextInt()、Random.nextInt() 和 math.random()区别
- Random的nextInt用法
- Random的nextInt用法
- Random的nextInt用法
- Random.nextint() 和Math.random()的区别
- Random.nextInt()
- String.valueOf(Math.abs(new Random().nextInt())
- Java: Random.nextInt() 和Math.random()的区别
- Java: Random.nextInt() 和Math.random()的区别
- Java中的Math.random和random.nextInt区别
- random.nextInt() random.nextDouble()
- Math类 random()与Random()
- Tornado自定义分布式session框架
- compareTo方法和compare方法
- 认识Xcode的调试器:LLDB调试技术
- uva129||hdu 1627 Krypton Factor 回溯法
- Linux_Service—NFS
- random.nextInt()与Math.random()基础用法
- bzoj1078: [SCOI2008]斜堆
- MyBatis(二)
- 数据库oracle,pgsq,mysql.相关设置
- HTML 语言代码参考手册
- 【图像处理】图像的极坐标变换
- c++中指针与引用的区别
- 蓝鸥Unity入门刚体学习笔记
- ArryList java.util.ConcurrentModificationException异常