숫자 (2)

💻 Programming/Java

[Java] 랜덤 숫자 구하기

랜덤 숫자들, 출처 : https://openclipart.org/detail/254729/random-numbers-cloud

이번 포스팅에서는 Java로 랜덤한 숫자를 획득하는 방법에 대해서 소개합니다.

 

자바에는 Math 클래스가 존재합니다.

 

해당 클래스에는 다양한 수학적인 계산을 위해 기본적으로 제공해주는 static 메서드들이 여러개 있는데,

그 중에 하나가 random() 메서드입니다.

 

이 메서드는 0에서 1사이의 랜덤한 double 타입 숫자를 반환합니다.

 

javadoc 문서에는 아래와 같이 설명이 나와있습니다.

 

random

public static double random()

Returns a double value with a positive sign, greater than or equal to 0.0 and less than 1.0. Returned values are chosen pseudorandomly with (approximately) uniform distribution from that range.

 

즉, 0.0보다 크거나 같고 1.0보다 작은 double(실수)형 숫자를 반환합니다. 

 

이게 0~1 사이의 수를 반환하면 이 메서드를 이용해서 어떻게 랜덤한 숫자를 얻을 수 있을까요?? 

 

예를 들어 0보다 크거나 같고 100보다 작은 수를 구하고자 한다면 아래와 같이 쓸 수 있습니다.

 

int max = 100;

int randomInt = (int) (Math.random() * max);

 

위 코드에서 (int) (Math.random() * max) 부분은 0 <= 결과값 < max (100) 의 범위 내의 값을 갖게 됩니다.

Math.random()의 최소값이 0이고 최대값이 1.0보다 작기 때문이죠. 

 

이번에는 100을 포함하도록 코드를 수정해 보겠습니다.

int max = 100;

int randomInt = (int) Math.round(Math.random() * max);

 

Math.round() 메서드를 이용하면 0<= 결과값 <= max (100) 범위 내의 값을 얻을 수 있습니다. 

 

하지만 이렇게 할 경우 0과 100이 나올 확률은 1~99가 나올 확률보다 50% 적게 됩니다.

 

0이 나오려면 Math.round()의 값이 0~0.004999...가 나와야 하고

100이 나오려면 0.95~0.9999...가 나와야 합니다.

 

이 경우 0.5%의 확률을 갖게 됩니다.

 

1이 나오려면 0.005~0.014999..가 나오면 되고, 2, 3, 4..., 99 까지는 모두 동일한 확률을 갖게 됩니다.

 

이 경우 1%의 확률을 갖게 되죠.

 

따라서 고르게 분포하는 0~100 사이의 값(경계포함)을 얻으려면 좀 더 고민을 해야합니다.

 

그럼 어떻게해야 0~100 사이의 숫자를 모두 동일한 확률로 얻을 수 있을까요??

 

int max = 100;
int randomInt = (int) (Math.random() * (max + 1));

간단합니다. max를 포함하고자 할 경우 max + 1을 곱해주면 만사OK입니다. 

 

자, 그럼 최소값의 범위를 정해주고 싶으면 어떻게 해야 할까요?

 

int min = 90, max = 100;
int randomInt = (int) (Math.random() * (max + 1 - min)) + min;

위 처럼 해주시면 됩니다.

 

즉, 랜덤하게 최대값에서 최소값을 뺀 만큼의 숫자를 만든 뒤에 최소값을 더해주는거죠. 

 

여기서는 최대값 100에서 1을 더하고 최소값 90을 빼서 최소 0~ 최대 10이 나오도록 만들었습니다. 

 

거기다가 min(90)값을 더해주면 0+90 ~ 10+90 사이의 수, 즉, 90~100 사이의 수를 얻을 수 있게되죠. 

 

하나하나 따라가니 어렵지 않죠?

 

오늘도 즐거운 코딩하시기 바랍니다~

 

💻 Programming/Java

[Java] 숫자 판별하기

 

자바에서 숫자 판별하기

 

Java의 스트링이 숫자(정수, int)인지 판단하기 위한 방법 두 가지를 소개합니다

 

 

1) 스트링의 각 문자를 하나하나 순회하면서 ascii 코드 값을 비교하는 방법

 

첫 번째로 소개해드릴 방법은 입력받은 문자열(스트링)의 각 문자가 0~9 ascii 코드값 사이에 있는 char인지를 판별하는 방법입니다.

 

0~9의 ascii 코드값은 십진수로 48~57 입니다.

 

따라서 String을 char[]로 변환한 다음 loop를 돌면서 각 char가 48~57사이의 값인지를 판단하여 숫자인지를 판별합니다.

 

코드는 아래와 같습니다.

String str = "not a number";

boolean isNumber = true;

for(char c : str.toCharArray()) {

  if(c >= 48 && c<= 57) {
        continue;
  } else {
        isNumber = false;
        break;
  }
}
System.out.println("Is string a number ? answer: " + isNumber);

 

2) Integer.parseInt 를 이용하는 방법

 

두 번째 방법은 Integer.parseInt 메서드를 이용하는 방법입니다.

 

parseInt 메서드에 대한 javadoc 문서에는 아래와 같이 설명이 나와있습니다.

public static int parseInt(String s)
                    throws NumberFormatException
Parses the string argument as a signed decimal integer. The characters in the string must all be decimal digits, except that the first character may be an ASCII minus sign '-' ('\u002D') to indicate a negative value. The resulting integer value is returned, exactly as if the argument and the radix 10 were given as arguments to theparseInt(java.lang.String, int) method.

 

Parameters:
s - a String containing the int representation to be parsed
Returns:
the integer value represented by the argument in decimal.
Throws:
NumberFormatException - if the string does not contain a parsable integer.

 

 

즉, 문자로 표현된 숫자를 입력받아 int로 return하는데요

입력받은 스트링이 숫자가 아닐 경우 NumberFormatException예외를 발생시킵니다.

 

따라서 위 메서드를 사용하여 NumberFormatException의 발생 여부에 따라 해당 스트링이 숫자인지 아닌지를 판별할 수 있습니다.

 

이 방식을 사용한 코드는 아래와 같습니다.

 

String str = "421303";

boolean isNumber = false;

try {

Integer.parseInt(str);

isNumber = true;

} catch (NumberFormatException e) {

// do nothing

}

System.out.println("Is string a number ? answer: " + isNumber);

 

Integer 뿐만 아니라 다른 wrapper 클래스들에도 Long.parseLong, Double.parseDouble 메서드들이 있으니 참고하시기 바랍니다.

 

 

위 두 가지 방법 외에 또 좋은 방법이 있으신 분들 제보받습니다 ㅎ

 

내용이 도움이 되셨다면 공감 누르고 가주세요~