Java基礎之Math類

  關於Math類,官方的解釋是(Api1.6中文版):java

  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 的近似值都能自動知足單調性要求。 dom

 

  Math做爲數學運算的方法,其方法包括以下:函數

  一、abs();求絕對值,根據傳的參數不一樣,其返回值類型也不一樣,可傳的參數類型有double、float、int、long四種類型,返回值類型也相對應的返回這四種類型,具體根據串的值來定。性能

    如:public static int abs(int a)spa

  返回 int 值的絕對值。若是參數爲非負數,則返回該參數。若是參數爲負數,則返回該參數的相反數。注意,若是參數等於 Integer.MIN_VALUE 的值(即可以表示的最小負 int 值),那麼結果與該值相同且爲負。

   參數:a - 要肯定絕對值的參數。線程

  返回:參數的絕對值。

  二、max();求傳入的兩個值中的最大值,這兩個值的數據類型要相同,如傳入兩個double、int、float、long值相對應返回的也是該類型的最大那個值。code

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

   返回兩個 double 值中較大的一個。也就是說,結果爲更接近正無窮大的參數。若是參數值相同,那麼結果也是同一個值。若是任一值爲 NaN,那麼結果爲 NaN。與數值比較運算不一樣,該方法認爲負 0 嚴格小於正 0。若是一個參數爲正 0,另外一個參數爲負 0,那麼結果爲正 0。

   參數:a - 參數。

   b - 另外一個參數。
  返回: ab 中的較大者。

 

  

  三、min();用法與max()同樣,只是這個方法是求兩個數中的最小值。

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

    返回兩個 long 值中較小的一個。也就是說,結果爲更接近 Long.MIN_VALUE 值的參數。若是參數值相同,那麼結果也是同一個值。

     參數:a - 參數。

    b - 另外一個參數。
    返回: ab 中的較小者。

 

  三、cos(double a);返回三角的餘弦;方法以下:

    public static double cos(double a)
  返回角的三角餘弦。特殊狀況以下:
  • 若是參數爲 NaN 或無窮大,那麼結果爲 NaN。計算結果必須在準確結果的 1 ulp 範圍內。結果必須具備半單調性。

   參數:a - 以弧度表示的角。

  返回:參數的餘弦。

  

  四、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的數,其他範圍肯定的隨機數也是按此方法操做。

相關文章
相關標籤/搜索