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

一,随机数产生方法

①最小值+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.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());
}
}

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.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);
}
}

输出:

第一个种子为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.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));

}
}

 

输出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;
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;
}
}

输出为: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 @ 2020-09-09 15:51  喜欢爬的孩子  阅读(193)  评论(0编辑  收藏  举报