Random中的随机数的产生机制
来源:互联网 发布:mac os 11.12 cdr 编辑:程序博客网 时间:2024/05/22 15:21
这句代码在Thinking in java中很常见
但是下面两句代码放在一起就会有点晕了
生成的随机数范围到底是什么,是0-47还是0-100,跟47和100又有什么关系。
下面对Random()的一些简单理解做一些说明吧。
伪随机数
对于随机数,大家都知道,计算机不可能产生完全随机的数字,所谓的随机数发生器都是通过一定的算法对事先选定的随机种子做复杂的运算,用产生的结果来近似的模拟完全随机数,这种随机数被称作伪随机数。
伪随机数是以相同的概率从一组有限的数字中选取的。所选数字并不具有完全的随机性,但是从实用的角度而言,其随机程度已足够了。
伪随机数的选择是从随机种子开始的,所以为了保证每次得到的伪随机数都足够地“随机”,随机种子的选择就显得非常重要。如果随机种子一样,那么同一个随机数发生器产生的随机数也会一样。
一般地,我们使用同系统时间有关的参数作为随机种子。
Random对象的生成
Random类包含两个构造方法,下面依次进行介绍:
(1)public Random()
该构造方法使用一个和当前系统时间对应的相对时间有关的数字作为种子数,然后使用这个种子数构造Random对象。
(2)public Random(long seed)
该构造方法可以通过制定一个种子数进行创建。
切记,种子数只是随机算法的起源数字,和生成的随机数字的区间无关!
随机种子对结果的影响
(1)随机种子一定,随机数范围一定,则单个对象单次运行的结果一定
选取随机种子为47,随机数最大值为20.
下面代码运行10次的结果总是为18.
(2)随机种子一定,随机数范围一定,则多个对象单次运行的结果一定
用相同的随机种子和随机范围生成了两个Random对象,但j和k的值每次都为18
(3)随机种子一定,随机数范围一定,但对象连续调用,运行结果不同
在下面的代码中一次循环内,rand对象被连续调用了3次,分别输出了18,15,13.
但每次循环的结果都一样,18,15,13会被顺序循环输出。
也就是说同一个Random对象在随机种子和随着范围一定的情况下,连续调用的次数不同会生成不同的随机数。
总结
最后结合API中的说明,再简要总结下Random()方法的功能:
(1)java.util.Random类中实现的随机算法是伪随机,也就是有规则的随机,所谓有规则的就是在给定种(seed)的区间内随机生成数字;
(2)相同种子数的Random对象,相同次数生成的随机数字是完全相同的;
(3)Random类中各方法生成的随机数字都是均匀分布的,也就是说区间内部的数字生成的几率均等;
写在最后
至于为什么随机种子在think in java中总是选47,看完上面的解释,可以简单理解为作者认为47是一个幸运数字或“魔数”吧
Random rand = new Random(47);
但是下面两句代码放在一起就会有点晕了
Random rand = new Random(47);int i = rand.nextInt(100);
生成的随机数范围到底是什么,是0-47还是0-100,跟47和100又有什么关系。
下面对Random()的一些简单理解做一些说明吧。
伪随机数
对于随机数,大家都知道,计算机不可能产生完全随机的数字,所谓的随机数发生器都是通过一定的算法对事先选定的随机种子做复杂的运算,用产生的结果来近似的模拟完全随机数,这种随机数被称作伪随机数。
伪随机数是以相同的概率从一组有限的数字中选取的。所选数字并不具有完全的随机性,但是从实用的角度而言,其随机程度已足够了。
伪随机数的选择是从随机种子开始的,所以为了保证每次得到的伪随机数都足够地“随机”,随机种子的选择就显得非常重要。如果随机种子一样,那么同一个随机数发生器产生的随机数也会一样。
一般地,我们使用同系统时间有关的参数作为随机种子。
Random对象的生成
Random类包含两个构造方法,下面依次进行介绍:
(1)public Random()
该构造方法使用一个和当前系统时间对应的相对时间有关的数字作为种子数,然后使用这个种子数构造Random对象。
public Random() { this(++seedUniquifier + System.nanoTime()); } private static volatile long seedUniquifier = 8682522807148012L;
(2)public Random(long seed)
该构造方法可以通过制定一个种子数进行创建。
Random r = new Random(10);
切记,种子数只是随机算法的起源数字,和生成的随机数字的区间无关!
随机种子对结果的影响
(1)随机种子一定,随机数范围一定,则单个对象单次运行的结果一定
选取随机种子为47,随机数最大值为20.
下面代码运行10次的结果总是为18.
public static void main(String[] args) { for (int i = 0; i < 10; i++) { Random rand = new Random(47); int j = rand.nextInt(20); System.out.println(j); } }
(2)随机种子一定,随机数范围一定,则多个对象单次运行的结果一定
用相同的随机种子和随机范围生成了两个Random对象,但j和k的值每次都为18
public static void main(String[] args) { for (int i = 0; i < 10; i++) { Random rand1 = new Random(47); Random rand2 = new Random(47); int j = rand1.nextInt(20); int k = rand2.nextInt(20); System.out.println(j); System.out.println(k); } }
(3)随机种子一定,随机数范围一定,但对象连续调用,运行结果不同
在下面的代码中一次循环内,rand对象被连续调用了3次,分别输出了18,15,13.
但每次循环的结果都一样,18,15,13会被顺序循环输出。
也就是说同一个Random对象在随机种子和随着范围一定的情况下,连续调用的次数不同会生成不同的随机数。
public static void main(String[] args) { for (int i = 0; i < 10; i++) { Random rand = new Random(47); int j = rand.nextInt(20); int k = rand.nextInt(20); int p = rand.nextInt(20); System.out.println(j); System.out.println(k); System.out.println(p); } }
总结
最后结合API中的说明,再简要总结下Random()方法的功能:
(1)java.util.Random类中实现的随机算法是伪随机,也就是有规则的随机,所谓有规则的就是在给定种(seed)的区间内随机生成数字;
(2)相同种子数的Random对象,相同次数生成的随机数字是完全相同的;
(3)Random类中各方法生成的随机数字都是均匀分布的,也就是说区间内部的数字生成的几率均等;
写在最后
至于为什么随机种子在think in java中总是选47,看完上面的解释,可以简单理解为作者认为47是一个幸运数字或“魔数”吧
阅读全文
1 0
- Random中的随机数的产生机制
- Random产生随机数与Math.random()产生随机数的比较
- Random:产生随机数的类
- * Random:产生随机数的类 *
- Random:产生随机数的类
- 使用Java中的Random类产生随机数
- java中的随机数产生方式,random()方法和Random类
- java中的随机数(Math.random()),以及如何产生一个类似于[21,77]区间的随机数。
- 产生随机数的Random类的框架
- Random不重复随机数的产生
- boost::random产生随机数的一种方法
- random()随机数的产生方式与原理
- random产生随机数
- Eigen random 产生随机数
- random产生随机数
- Random ThreadLocalRandom 产生随机数
- Random类产生随机数
- math.random与Random产生随机数的方法
- JavaScript循环结构
- Volley源码笔记
- 原语(操作系统)
- iOS Block属性
- Servlet 技术总结
- Random中的随机数的产生机制
- 利用java代码连接加密的linux上的mongoDB数据库
- Thread
- ORA-01000: maximum open cursors exceeded
- HDU 6034 Balala Power!
- 利用tomcat与LDAP集成并实现JavaEE标准资源权限管理方案
- 微信小程序开发-新闻列表之新闻列表绑定
- vue 模块通信
- 比特币(BitCoin)学习第一天-什么是比特币(BitCoin)?