Java基础之Math类

  关于Math类,官方的解释是(Api1.6中文版):

  Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。

  与 StrictMath 类的某些数学方法不同,并非 Math 类所有等价函数的实现都定义为返回逐位相同的结果。此类在不需要严格重复的地方可以得到更好的执行。

  默认情况下,很多 Math 方法仅调用 StrictMath 中的等价方法来完成它们的实现。建议代码生成器使用特定于平台的本机库或者微处理器指令(可用时)来提供 Math 方法更高性能的实现。这种更高性能的实现仍然必须遵守 Math 的规范。

  实现规范的质量涉及到两种属性,即返回结果的准确性和方法的单调性。浮点 Math 方法的准确性根据 ulp(units in the last place,最后一位的进退位)来衡量。对于给定的浮点格式,特定实数值的 ulp 是包括该数值的两个浮点值的差。当作为一个整体而不是针对具体参数讨论方法的准确性时,引入的 ulp 数用于任何参数最差情况下的误差。如果一个方法的误差总是小于 0.5 ulp,那么该方法始终返回最接近准确结果的浮点数;这种方法就是正确舍入。一个正确舍入的方法通常能得到最佳的浮点近似值;然而,对于许多浮点方法,进行正确舍入有些不切实际。相反,对于 Math 类,某些方法允许误差在 1 或 2 ulp 的范围内。非正式地,对于 1 ulp 的误差范围,当准确结果是可表示的数值时,应该按照计算结果返回准确结果;否则,返回包括准确结果的两个浮点值中的一个。对于值很大的准确结果,括号的一端可以是无穷大。除了个别参数的准确性之外,维护不同参数的方法之间的正确关系也很重要。因此,大多数误差大于 0.5 ulp 的方法都要求是半单调的:只要数学函数是非递减的,浮点近似值就是非递减的;同样,只要数学函数是非递增的,浮点近似值就是非递增的。并非所有准确性为 1 ulp 的近似值都能自动满足单调性要求。 

 

  Math作为数学运算的方法,其方法包括如下:

  1、abs();求绝对值,根据传的参数不同,其返回值类型也不同,可传的参数类型有double、float、int、long四种类型,返回值类型也相对应的返回这四种类型,具体根据串的值来定。

    如:public static int abs(int a)

  返回  int 值的绝对值。如果参数为非负数,则返回该参数。如果参数为负数,则返回该参数的相反数。注意,如果参数等于  Integer.MIN_VALUE 的值(即能够表示的最小负  int 值),那么结果与该值相同且为负。

   参数:a - 要确定绝对值的参数。

  返回:参数的绝对值。

  2、max();求传入的两个值中的最大值,这两个值的数据类型要相同,如传入两个double、int、float、long值相对应返回的也是该类型的最大那个值。

    如:public static double max(double a,double b)

   返回两个  double 值中较大的一个。也就是说,结果为更接近正无穷大的参数。如果参数值相同,那么结果也是同一个值。如果任一值为 NaN,那么结果为 NaN。与数值比较运算不同,该方法认为负 0 严格小于正 0。如果一个参数为正 0,另一个参数为负 0,那么结果为正 0。

   参数:a - 参数。

   b - 另一个参数。
  返回: a 和  b 中的较大者。

 

  

  3、min();用法与max()一样,只是这个方法是求两个数中的最小值。

    如:public static long min(long a,long b)

    返回两个  long 值中较小的一个。也就是说,结果为更接近  Long.MIN_VALUE 值的参数。如果参数值相同,那么结果也是同一个值。

     参数:a - 参数。

    b - 另一个参数。
    返回: a 和  b 中的较小者。

 

  3、cos(double a);返回三角的余弦;方法如下:

    public static double cos(double a)
  返回角的三角余弦。特殊情况如下:
  • 如果参数为 NaN 或无穷大,那么结果为 NaN。计算结果必须在准确结果的 1 ulp 范围内。结果必须具有半单调性。

   参数:a - 以弧度表示的角。

  返回:参数的余弦。

  

  4、tan(double a);返回三角的正切,用法同余弦。

  当然还有很多不数学运算,如正弦sin(double a);立方根cbrt(double a);等。此处主要以random()为主。

  

  public static double random()
  返回带正号的  double 值,该值大于等于  0.0 且小于  1.0。返回值是一个伪随机选择的数,在该范围内(近似)均匀分布。

  第一次调用该方法时,它将创建一个新的伪随机数生成器,与以下表达式完全相同

  new java.util.Random
  之后,新的伪随机数生成器可用于此方法的所有调用,但不能用于其他地方。

  此方法是完全同步的,可允许多个线程使用而不出现错误。但是,如果许多线程需要以极高的速率生成伪随机数,那么这可能会减少每个线程对拥有自己伪随机数生成器的争用。

  返回:大于等于  0.0 且小于  1.0 的伪随机  double 值。

  

   比较常见的就是彩票里面机选号码时产生的随机数了,此处以双色球中产生的随机数为例,其余的产生随机数的方法类似,具体代码如下所示:

   

/**
 * 模拟双色球输入的次数随机生成选择的类即前面6个红球加最后一位篮球
 * @author James
 *
 */
public class Tickit {

	public static void main(String[] args) {
		System.out.println("请输入随机的次数:");
		Scanner input = new Scanner(System.in);
		int number = input.nextInt();//要产生的随机的次数
		if (number > 1) {
			for (int i = 0; i < number; i++) {
				int[] nums = new int[7];//生成一个长度为7的数组存放数值
				int[] num = getRedBall();
				for (int j = 0; j < num.length; j++) {
					nums[j] = num[j];
				}
				nums[6] = getBlueBall();
				//遍历新生成的数组
				System.out.println();
				for (int n : nums) {
					System.out.print(n + "\t");
				}
			}
		}

	}

	/**
	 * 生成6个红球的方法
	 * 
	 * @return 返回生成的数字集合
	 */
	public static int[] getRedBall() {
		int[] nums = new int[6];
		int num;
		boolean isTheBall = false;
		for (int i = 0; i < 6; i++) {
			do {
				num = (int) (Math.random() * 33) + 1;
				isTheBall = isHava(num, nums);
			} while (isTheBall);

			nums[i] = num;
		}
		Arrays.sort(nums);//调用默认的升序排列数组的方法
		return nums;
	}

	/**
	 * 判断是否有重复的数字
	 * 
	 * @param num
	 *            要添加的数
	 * @param nums
	 *            要添加进的数组
	 * @return 是否重复
	 */
	public static boolean isHava(int num, int[] nums) {
		for (int j = 0; j < 6; j++) {
			if (num == nums[j]) {
				return true;
			}
		}
		return false;
	}

	/**
	 * 随机选择1个篮球
	 * 
	 * @return 篮球的数字
	 */
	public static int getBlueBall() {
		int num = (int) (Math.random() * 16) + 1;
		return num;
	}

}

  

  由于Math.random()产生的数在0<= number<1;所有如果要产生一个1-16之间的数要将number乘以16,根据java编程的特性转换成int型的时候将舍去小数点只留整数部分,此时产生的结果是0-15之间的数,所以要在此基础上再加1这样就产生了1-16的数,其余范围确定的随机数也是按此方法操作。

 

发布了92 篇原创文章 · 获赞 24 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/q394895302/article/details/63687584