C, PHP, VB, .NET

Дневникът на Филип Петров


* java.lang.Math

Публикувано на 07 октомври 2009 в раздел ПИК3 Java.

Нека разгледаме още един клас с доста статични методи, който се използва сравнително често. Това е класът Math - с него можем да достъпваме голямо количество математически функции. Ето по-голямата част от тях:

  1. Абсолютна стойност на число: метод abs връщащ double и приемаш за входен параметър всякакъв тип число:
        int i = 7;
        int j = -2;
        double x = -12.4;
        double y = 6;
        System.out.println("i = "+i+", |" + i + "| = " + Math.abs(i));
        System.out.println("j = "+j+", |" + j + "| = " + Math.abs(j));
        System.out.println("x = "+x+", |" + x + "| = " + Math.abs(x));
        System.out.println("y = "+y+", |" + y + "| = " + Math.abs(y));
  2. Минимум и максимум - методи min и max, приемащи всякакъв тип двойки числа за входни параметри и връщащ по-малкото/по-голямото от тях:
        int i = 7;
        int j = -2;
        double x = -12.4;
        double y = 6.9;
        System.out.println("min(" + i + "," + j + ") = " + Math.min(i,j));
        System.out.println("max(" + i + "," + j + ") = " + Math.max(i,j));
        System.out.println("min(" + x + "," + y + ") = " + Math.min(x,y));
        System.out.println("max(" + x + "," + y + ") = " + Math.max(x,y));

    Възможно е обаче и да "смесваме" типовете данни и да сравняваме цели числа с числа с плаваща запетая (резултатът е число с плаваща запетая):

        System.out.println("min(" + i + "," + x + ") = " + Math.min(i,x));
        System.out.println("max(" + i + "," + x + ") = " + Math.max(i,x));
        System.out.println("min(" + y + "," + j + ") = " + Math.min(y,j));
        System.out.println("max(" + j + "," + y + ") = " + Math.max(j,y));
  3. Долна граница - метод floor, работещ с числа от тип double:
        double x = -12.6;
        double y = 6.9;
        System.out.println("Floor("+x+") = "+Math.floor(x)); // -13
        System.out.println("Floor("+y+") = "+Math.floor(y)); // 6
  4. Горна граница - метод ceil, работещ с числа от тип double:
        double x = -12.6;
        double y = 6.9;
        System.out.println("Ceil("+x+") = "+Math.ceil(x)); // -12
        System.out.println("Ceil("+y+") = "+Math.ceil(y)); // 7
  5. Закръгляване - метод round, работещ с числа от тип double за входни параметри, но връщащ като резултат число от тип long:
        double x = -12.6;
        double y = 6.9;
        System.out.println("Round(x) = " + Math.round(x)); // -13
        System.out.println("Round(y) = " + Math.round(y)); // 7

    Всъщност Math.round(x) е еквивалентно на Math.floor(x+0.5d).

  6. Тригонометрични функции (параметрите се дават в радиани като числа от тип double и връщат резултат също число от тип double):
        System.out.println(Math.sin(Math.PI/4));
        System.out.println(Math.cos(Math.PI/4));
        System.out.println(Math.tan(Math.PI/4));
  7. Обратни тригонометрични функции (отново работят с числа от тип double):
        System.out.println(Math.asin(0.7d));
        System.out.println(Math.acos(0.7d));
        System.out.println(Math.atan(0.7d));
  8. Превръщане на радиани в градуси (работи с числа от тип double):
        System.out.println(Math.toDegrees(Math.PI));
  9. Превръщане на градуси в радиани (работи с числа от тип double):
        System.out.println(Math.toRadians(180.0));
  10. Повдигане на степен (връща числа от тип double, а приема всякакви):
        System.out.println(Math.pow(2,6));
  11. Натурален логаритъм (работи с числа от тип double):
        System.out.println(Math.log(Math.E));
  12. Експоненциална функция (работи с числа от тип double):
        System.out.println(Math.exp(2));
  13. Корен квадратен (работи с числа от тип double):
        System.out.println(Math.sqrt(8));
  14. Произволно число от тип double с плаваща запетая в интервала [0, 1):
        System.out.println(Math.random());

    Eто как можем да го превърнем в цяло число в интервала [A,A+B]:

       int A=5;
       int B=7;
       System.out.println((int)(Math.round(Math.random()*B)) + A);

Пример: статичен метод, който генерира произволни пароли от малки букви, големи букви и цифри:

  public static void main(String[] args){
    StringBuffer strb = genpass(8);
    System.out.println(strb.toString());
  }
  public static StringBuffer genpass(int len){
    StringBuffer strb = new StringBuffer(len);
    int c = 0;
    for (int i=0; i<len; i++){
      int r = (int)Math.round(Math.random()*2);
      switch(r){
        case 0:
          c = (int)'0' + (int)(Math.floor(Math.random()*10));
          break;
        case 1:
          c = (int)'a' + (int)(Math.floor(Math.random()*26));
          break;
        case 2:
          c = (int)'A' + (int)(Math.floor(Math.random()*26));
          break;
      }
      strb.append((char)c);
    }
    return strb;
  }

Задача: Вероятността да се падне цифра е 1/3. Вероятността да се падне цифрата 1 е (1/3)*(1/10). Ще забележите, че това е доста по-голяма вероятност, отколкото да се падне буквата 'a' например - (1/3)*(1/26). Преправете програмата така, че цифрите и буквите да имат равни вероятности.

 



Добави коментар

Адресът на електронната поща няма да се публикува


*