이번 포스팅에서는 Java로 랜덤한 숫자를 획득하는 방법에 대해서 소개합니다.
자바에는 Math 클래스가 존재합니다.
해당 클래스에는 다양한 수학적인 계산을 위해 기본적으로 제공해주는 static 메서드들이 여러개 있는데,
그 중에 하나가 random() 메서드입니다.
이 메서드는 0에서 1사이의 랜덤한 double 타입 숫자를 반환합니다.
javadoc 문서에는 아래와 같이 설명이 나와있습니다.
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 사이의 수를 얻을 수 있게되죠.
하나하나 따라가니 어렵지 않죠?
오늘도 즐거운 코딩하시기 바랍니다~
[Java] 로또 번호 자동 생성기 만들기 (0) | 2019.06.17 |
---|---|
[Java] Reversing String Using StringBuilder (StringBuilder로 스트링을 거꾸로 뒤집기) (0) | 2019.02.25 |
[Java] 숫자 판별하기 (0) | 2019.01.27 |
AWS S3 Security Credentials 만들기 (0) | 2018.08.17 |
AWS S3 버킷에 파일 업로드하기 (자바) (0) | 2018.08.17 |
Java의 스트링이 숫자(정수, int)인지 판단하기 위한 방법 두 가지를 소개합니다
첫 번째로 소개해드릴 방법은 입력받은 문자열(스트링)의 각 문자가 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);
두 번째 방법은 Integer.parseInt 메서드를 이용하는 방법입니다.
parseInt 메서드에 대한 javadoc 문서에는 아래와 같이 설명이 나와있습니다.
public static int parseInt(String s)
throws NumberFormatException
'-'
('\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.
s
- a String
containing the int
representation to be parsedNumberFormatException
- 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 메서드들이 있으니 참고하시기 바랍니다.
위 두 가지 방법 외에 또 좋은 방법이 있으신 분들 제보받습니다 ㅎ
내용이 도움이 되셨다면 공감 꾹 누르고 가주세요~
[Java] Reversing String Using StringBuilder (StringBuilder로 스트링을 거꾸로 뒤집기) (0) | 2019.02.25 |
---|---|
[Java] 랜덤 숫자 구하기 (0) | 2019.01.27 |
AWS S3 Security Credentials 만들기 (0) | 2018.08.17 |
AWS S3 버킷에 파일 업로드하기 (자바) (0) | 2018.08.17 |
[Java] Heap Memory Check (자바 힙메모리 사용량 측정) (0) | 2018.07.28 |