天天看点

Java中生成随机数的方法随机java.util.Randomjava.lang.Math浏览过的博客

论文实验中需要给PM、VM的资源容量随机赋值,所以在网上查了一些Java中生成随机数的方法。

Java生成随机数

  • 随机
  • java.util.Random
    • random.nextInt
      • random.nextInt()
      • random.nextInt(int n)
    • random.nextDouble()
    • Random类中的其他方法
  • java.lang.Math
  • 浏览过的博客

随机

关于随机的概念有很多。我个人理解,万事万物间必然存在某种联系,我们所说的“真随机”、“假随机”,不过是依据人类目前是否已经掌握其内在规律来说,以此判断其未来是否可以预测,从而保证了建立在不可预测性基础上的随机性和随机带来的安全性。

java.util.Random

random.nextInt

random.nextInt() 为 java.util.Random类中的方法。

Random是一个用于产生随机数的生成器,它的构造函数有两个——Random()和Random(long seed):

Random()是以 与当前系统时间相关的一个数字 为默认种子,这篇博客给出了其构造函数在JDK中的实现代码。 color = “red”>待回学校确认。

Random(long seed)是以指定的种子值进行构造。

产生之后,借助不同的语句产生不同类型的数。

种子:简单来说,就是一个数。之所以叫种子,是因为第一次生成的随机数,与你所填的这个数值有关,所以形象的称之为“种子”。原理是通过一个函数,将这个数值转化为随机数空间中的某一个点上,并且产生的随机数均匀的散布在空间中。以后产生的随机数都与前一个随机数有关。

random.nextInt()

生成所有有效的整数,包含正数,负数,0。这个整数的范围就是int类型的范围-2^31 ~ 2^31-1。

random.nextInt(int n)

生成一个**[0,n)**内的任意正整数。

eg. random.nextInt(4)将产生0,1,2,3这4个数字中的任何一个数字,注意这里不是0-4,而是0-3。

如果Random对象指定了种子,Random r = new Random(100),那么第一次nextInt()出来的值是固定的,即种子数值?但还有文章提到,不仅第一个数值相同,是整个序列相同,谁对谁错,带回学校确认。这篇博客两段代码是有区别的,因为"Random r = new Random(100);"所在位置不同,第一个在循环外面,只调用一次;第二个再循环里面,每次都重新生成random,正好印证了链接标题的意思。

//给定种子
Random r = new Random(1);

//nextInt,之所以起这个名字,我自己的理解是指右边界在哪
//因为含参的nextInt是用来设定随机数的生成范围,即[0,n)之间选定一个随机数。
int ran1 = r.nextInt(100);
           

也可以使用random生成大小字母与数字的随机组合密码,用一个数组来存放可能组成密码的字符,详见这篇博客。

random.nextDouble()

用于生成一个在0.0和1.0之间均匀分布的 double值

Random类中的其他方法

可以参考这个网站,有每个函数的简单说明

java.lang.Math

Math.random() 为 java.lang.Math 类中的静态方法,用于生成[0, 1)范围内的double类型随机数。

且其线程安全,多线程环境能被调用。

浏览过的博客

最后,写一些我为了写全本文的内容,阅读过的博客,大家可以去看看,并给出了我认为每篇文章中,对我帮助最大的部分。

这篇博客中,给出了上面两个类,生成随机数在JDK中的代码实现。是否确是JDK最新源码,待回学校确认。并提出了一种“ 如果需要生成随机整数,则使用(int)(Math.random()*n)的方式生成随机数即可”的方案。文中还验证了“相同种子数的Random对象生成的随机数序列相同”,并给出了截图证明。但这与本文 java.util.Random部分中,所提相同种子,仅第一个随机数相同的说法相左。待回学校确认

而这篇博客中,给出了若干使用Random类生成各种范围内随机数的实现代码。

之前看了篇博客,提出了一种使用 java.lang.Math 生成随机数的方法,我不是太认可,大家可以自己去看看这篇文章,按照自己的理解去选择。