随机数的生成,静态导入,可变参数的方法,方法重载,浮点数的比较

一,随机数产生方法

最小值+Math.random() *(最大值-最小值+1):产生的数的范围在   [最小值,最大值] 

package com.java1;
import javax.swing.JOptionPane;

public class RandomInt {
   public static void main( String args[] )
   {
      int value;
      String output = "";

      for ( int i = 1; i <= 20; i++ ) {
         value =  (int) ( 1+Math.random() * 6 );
         output += value + "  ";
         
         if ( i % 5 == 0 )
            output += "\n";
      }

      JOptionPane.showMessageDialog( null, output,
         "20 Random Numbers from 1 to 6",
         JOptionPane.INFORMATION_MESSAGE );

      System.exit( 0 );
   }
}

产生的随机数的范围在1-6之间

 

 

 ②利用new Random().nextInt(26)的方法来实现输出一个大于等于0,小于26的随机数

package com.java1;
import java.util.*;

public class TestRandom
{
    public static void main(String[] args) 
    {
        Random rand = new Random();
        System.out.println("rand.nextBoolean():" + rand.nextBoolean());
        byte[] buffer = new byte[16];
        rand.nextBytes(buffer);
        System.out.println(Arrays.toString(buffer));
        //生成0.0~1.0之间的伪随机double数
        System.out.println("rand.nextDouble():" + rand.nextDouble());
        //生成0.0~1.0之间的伪随机float数
        System.out.println("rand.nextFloat():" + rand.nextFloat());
        //生成平均值是 0.0,标准差是 1.0的伪高斯数
        System.out.println("rand.nextGaussian():" + rand.nextGaussian());
        //生成一个处于long整数取值范围的伪随机整数
        System.out.println("rand.nextInt():" + new Random().nextInt());
        //生成0~26之间的伪随机整数
        System.out.println("rand.nextInt(26):" + rand.nextInt(26));
        //生成一个处于long整数取值范围的伪随机整数
        System.out.println("rand.nextLong():" +  rand.nextLong());
    }
}

Answer:

rand.nextBoolean():true
[103, -90, -76, 58, -91, -52, -23, 45, 50, 73, -43, 70, 77, -64, -48, -122]
rand.nextDouble():0.1631898380376655
rand.nextFloat():0.1340416
rand.nextGaussian():-1.8408133377651577
rand.nextInt():-382427923
rand.nextInt(26):3
rand.nextLong():-1029091829791802274

③通过不同的种子来产生Random对象,和以当前时间为种子来产生Random对象

package com.java1;
import java.util.Random;

public class TestSeed
{
    public static void main(String[] args)
    {
        Random r1 = new Random(50);
        System.out.println("第一个种子为50的Random对象");
        System.out.println("r1.nextBoolean():\t" + r1.nextBoolean());
        System.out.println("r1.nextInt():\t\t" + r1.nextInt());
        System.out.println("r1.nextDouble():\t" + r1.nextDouble());
        System.out.println("r1.nextGaussian():\t" + r1.nextGaussian());
        System.out.println("---------------------------");
        
        Random r2 = new Random(50);
        System.out.println("第二个种子为50的Random对象");
        System.out.println("r2.nextBoolean():\t" + r2.nextBoolean());
        System.out.println("r2.nextInt():\t\t" + r2.nextInt());
        System.out.println("r2.nextDouble():\t" + r2.nextDouble());
        System.out.println("r2.nextGaussian():\t" + r2.nextGaussian());
        System.out.println("---------------------------");
        
        Random r3 = new Random(100);
        System.out.println("种子为100的Random对象");
        System.out.println("r3.nextBoolean():\t" + r3.nextBoolean());
        System.out.println("r3.nextInt():\t\t" + r3.nextInt());
        System.out.println("r3.nextDouble():\t" + r3.nextDouble());
        System.out.println("r3.nextGaussian():\t" + r3.nextGaussian());
        
       
        Random r4 = new Random(System.currentTimeMillis());
        System.out.println("以当前时间为种子的Random对象");
        System.out.println("r3.nextBoolean():\t" + r4.nextBoolean());
        System.out.println("r3.nextInt():\t\t" + r4.nextInt());
        System.out.println("r3.nextDouble():\t" + r4.nextDouble());
        System.out.println("r3.nextGaussian():\t" + r4.nextGaussian()); 
    }
}

输出:

第一个种子为50的Random对象
r1.nextBoolean(): true
r1.nextInt(): -1727040520
r1.nextDouble(): 0.6141579720626675
r1.nextGaussian(): 2.377650302287946
---------------------------
第二个种子为50的Random对象
r2.nextBoolean(): true
r2.nextInt(): -1727040520
r2.nextDouble(): 0.6141579720626675
r2.nextGaussian(): 2.377650302287946
---------------------------
种子为100的Random对象
r3.nextBoolean(): true
r3.nextInt(): -1139614796
r3.nextDouble(): 0.19497605734770518
r3.nextGaussian(): 0.6762208162903859
以当前时间为种子的Random对象
r3.nextBoolean(): true
r3.nextInt(): 1678327555
r3.nextDouble(): 0.16760365386964127
r3.nextGaussian(): -0.7219839638959297

由结果我们可以知道:相同的种子产生的随机数是相同的,以当前时间为种子产生的随机数一定是独一无二的。

手写代码来实现1000个随机数

根据公式:

 

 

 其中Xn=输入的种子数

 

 

c=0;  a=75=16807;  m=Integer.MAX_VALUE;

package com.randseed;
import java.lang.*;
import java.util.Scanner;
public class randseed {
    public static void rand(long x)
    {
        long a;
        for(int i=1;i<=1000;i++)
        {
            a=(x*16807)%Integer.MAX_VALUE;//由公式得
            System.out.println(a);
            x=a;
        }
    }
    
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        System.out.println("请输入种子数:");
        long seed;
        seed=in.nextLong();
        rand(seed);
    }
}

输出1000个随机数。

二,静态导入

通过静态导入就不用再调用:类名.方法名,而是转换成直接使用方法名进行调用。

下面给出三种方式来解决abs绝对值的问题

package com.randseed;
import static java.lang.Math.*;
public class importstatic {
    
public static void Abs(int a)
{
    if(a<0)
        a=-a;
    System.out.println(a);
}

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println(abs(-100));//已经静态导入,故可以直接使用方法
        System.out.println(Math.abs(-100));//数学函数本生就是静态的方法
        Abs(-100);//自定义一个静态的方法
    }
//三者结果都是相同的
}

三者输出结果都是:100

三,可变参数的方法

利用可变参数的方法来计算传入的参数中最大值.

package com.java1;
import java.awt.*;
import java.awt.event.*;
import java.util.*;


public class VariableArgumentsTest{
    
    public static double max(double...values)
    {
        double largest=Double.MIN_VALUE;
        for (double v:values)
            if(v>largest) largest=v;
        return largest;
    }

    public static void main(String args[]) {
    
         System.out.println("Max:"+max(1,11,300,2,3,50,1500,2010,2019));
            
    }
}

输出为:2019

 四,方法重载的要点

重载关系的条件:

方法名相同

参数类型不同,参数个数不同,参数顺序不同

注意:方法的返回值不能作为判断的依据

package com.java1;
public class MethodOverload {

    public static void main(String[] args) {
        System.out.println("The square of integer 7 is " + square(7));
        System.out.println("\nThe square of double 7.5 is " + square(7.5));
    }

    public static int square(int x) {
        return x * x;
    }

    public static double square(double y) {
        return y * y;
    }
}

上述代码中:有两个square方法,但其参数类型不同,故而在调用时就会选择不同的方法名进行运算,

输出:

The square of integer 7 is 49

The square of double 7.5 is 56.25

五,浮点数的比较

在日常计算中难免会用到浮点数的比较,然而在浮点数之间的比较中能直接用==吗?

答案:否

不能直接用==来判断两个浮点数的值,而应该使用两数相减的绝对值小于一个极小的数,则两数相等。

package com.java1;


public class CompareFloatNumber {

    /**
     * @param args
     */
    public static void main(String[] args) {
        compare();
        compare2();

    }

    private static void compare() {
        double i = 0.0001;
        double j = 0.00010000000000000001;
        System.out.println(i==j);  //输出:true
    }
    private static void compare2() {
        double i = 0.0001;
        double j = 0.000100000000600000001;
        if(Math.abs(i-j)<1e-20){
            System.out.println("true");  
        }
        else
        {
            System.out.println("false");
        }
        
    }

}

输出:

true

false

因此,我们不能向比较整型一样来比较浮点数。

 

posted @ 2019-09-25 16:34  清风紫雪  阅读(359)  评论(0编辑  收藏  举报