← 返回首页
JavaSE系列教程(五十二)
发表时间:2020-02-02 13:04:54
讲解Math数学工具类以及如何生成随机数。

1.java.util.Math

java.util.Math类是数学相关的工具类,里面提供了大量的静态方法,完成与数学运算相关的操作。

Math常用静态方法和常量如下:

方法名字 说明
abs 求绝对值
max 求最大值
min 求最小值
sqrt 求平方根
pow(a,b) 求以a为底的b次方
Math.PI 圆周率常量
Math.E 自然对数常量
round(n) n+0.5后向下取整
random 生成随机数,0 <= 随机数 < 1

通过一个实例理解以上方法。


        System.out.println(Math.abs(-10));
        System.out.println(Math.max(10, 13));
        System.out.println(Math.min(3.14, 3.1415));
        System.out.println(Math.sqrt(100));
        System.out.println(Math.pow(2, 10));
        System.out.println(Math.round(-4.5));
        System.out.println(Math.PI);
        System.out.println(Math.E);
        System.out.println(Math.random());

运行结果:
10
13
3.14
10.0
1024.0
-4
3.141592653589793
2.718281828459045
0.2459411434915556

2.如何生成随机数

1)使用Math.random() 例如:生成10个1-33之间的随机数。

for(int i=0;i<10;i++){
   System.out.println((int) (Math.random() * 100) % 33 + 1);
}

运行结果:

29
15
25
9
6
13
17
1
7
13

2)使用Random随机数类

例如:生成10个1-33之间的随机数。

Random r = new Random(); //生成随机数对象
for(int i=0;i<10;i++){
   //r.nextInt(int bound); 规定生成的随机数的上界。即范围在0-32之间。
   System.out.println(r.nextInt(33) + 1); 
}

运行结果:
9
14
28
21
16
32
19
5
3
3

3)使用SecureRandom

我们知道,Random类中实现的随机算法是伪随机,也就是有规则的随机。在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字。相同种子数的Random对象,相同次数生成的随机数字是完全相同的。也就是说,两个种子数相同的Random对象,生成的随机数字完全相同。所以在需要频繁生成随机数,或者安全要求较高的时候,不要使用Random,因为其生成的值其实是可以预测的。

SecureRandom类提供加密的强随机数生成器 (RNG),SecureRandom内置两种随机数算法,NativePRNG和SHA1PRNG。

我们可以使用new和getInstance来获得一个SecureRandom对象。

SecureRandom secureRandom1 = new SecureRandom();
SecureRandom secureRandom2 = SecureRandom.getInstance("SHA1PRNG");//SHA1PRNG参数是算法的名字

生成10个1-33之间的随机数。

SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");

for(int i=0;i<10;i++){
   System.out.println(secureRandom.nextInt(33) + 1);
}

运行结果:
23
22
11
24
9
15
8
2
9
2

也可以使用nextBytes(byte[] bytes)和generateSeed(int numBytes)方法获得一个随机的byte数组,这个数组中的数通常可以用来做其他随机生成器的种子。