자바 3 자리 난수 - jaba 3 jali nansu

java.util.Random 클래스를 사용하여 int, long, float, double 타입의 난수를 생성하여 리턴 받을 수 있다. 이런 클래스를 제공해주니 별도로 개발자가 구현하지 않아도 됨으로 편하다. 그렇다면 이런 난수를 발생하면서 까지 개발을 해야하는 것은 무엇을까? 만약 게임을 만든다면 주사위게임이나 카드게임을 만들때 난수를 사용할 수 있다. 혹은 로또번호 생성기를 만들때 사용할 수 있지 않을까? 그럼, 이제 샘플코드를 참고하여 살펴보자.

■Java Random클래스를 사용한 예시

import java.util.Random; public static CreateRandomNumbers(){ Random createRandom = new Random(); int iCreateNumber = createRandom.nextInt(45); } import java.util.Random; public static CreateRandomNumbers(){ Random createRandom = new Random(); //for문을 사용하여 10개의 난수를 발생시켜보자. for(int i = 0; i<10; i++){ int iCreateNumber = createRandom.nextInt(45); System.out.println("Random Number : " + iCreateNumber); } }

출력결과 (Output) :

Random Number : 5 Random Number : 25 Random Number : 21 Random Number : 31 Random Number : 14 Random Number : 45 Random Number : 29 Random Number : 18 Random Number : 35 Random Number : 1

Random클래스의 객체는 ceateRandom으로 초기화 하였다. Random 클래스에는 nextInt()와 같은 메소드가 있다.

최대값으로 지정된 인수를 기반으로 난수를 생성하여 리턴한다. 예시에서와 같이 45를 인수로 받았다면

최소값 0부터 최대값 45까지의 숫자중에 랜덤으로 1개의 값을 리턴해준다.

나는 1에서 45사이의 정수값만 리턴 받고 싶다면 어떻게 하면 될까? 플러스1을 해주면 된다. 다음 예시를 보자.

import java.util.Random; public static CreateRandomNumbers(){ Random createRandom = new Random(); // 1~45 사이의 정수 랜던 값을 생성한다. int iCreateNumber = createRandom.nextInt(45) + 1; System.out.println("Random Number : " + iCreateNumber); // 10~54 사이의 정수 랜던 값을 생성한다. int iCreateNumber = createRandom.nextInt(45) + 10; System.out.println("Random Number : " + iCreateNumber); }

음수와 양수의 랜덤값을 생성하는 방법에 대한 예시는 다음과 같다. nextInt()메소드 뒤에 마이너스 값을 넣어 주면된다.

import java.util.Random; public static CreateRandomNumbers(){ Random createRandom = new Random(); // -10~10 사이의 정수 랜던 값을 생성한다. for(int i = 0; i<10; i++){ int iCreateNumber = createRandom.nextInt(21) - 10; System.out.println("Random Number : " + iCreateNumber); } }

출력결과 (Output) :

Random Number : -1 Random Number : -8 Random Number : -2 Random Number : 8 Random Number : 0 Random Number : 10 Random Number : 3 Random Number : -9 Random Number : -8 Random Number : 6

Random클래스는 nextBoolean(), nextBytes(), nextDouble(), next Float(), nectLong() 등의 메소드도 지원한다.

필요한 상황에 맞게 메소드를 호출하여 사용하자.

두번째 방법으로 Math.random()를 이용한 난수 생성 방법도 있다. 10개의 임의의 숫자를 생성해보자.

Java Math.random을 사용한 예시

import java.util.Random; public static CreateRandomNumbers(){ Random createRandom = new Random(); //for문을 사용하여 10개의 난수를 발생시켜보자. for(int i = 0; i<10; i++){ double num = Math.random(); System.out.println("Random Number : " + num); } }

출력결과 (Output) :

Random Number : 0.6578861657634629 Random Number : 0.9727201349574885 Random Number : 0.3114755044056362 Random Number : 0.31797796598960437 Random Number : 0.52829933342384 Random Number : 0.23116462079911893 Random Number : 0.7306332891555806 Random Number : 0.6513404778327031 Random Number : 0.5189674039641334 Random Number : 0.14475603623366773

리턴 값은 유일하게 double 타입이다. 정수형은 제공하지 않는다. 정수가 아닌 0.0에서 ~1.0 범위에서의 double값을 얻을 수 있다.

참조 : //docs.oracle.com/javase/8/docs/api/java/util/Random.html

Random클래스를 열어보았더니, 최 상단 주석에 ORACLE이 보였다. 구글과 오라클은 JAVA 라이센스 문제로 몇 년간 계속 법정에서 싸우고 있다.지금은 결판이 났나 모르겠다.조만간 결판이 나지 않을까 생각된다. 오라클은 썬마이크시스템을 인수하면서 JAVA의 유료화를 생각해두고 있었을지도 모른다. 나는 구글이 승소하길 바라고 있다.

아마 자바 개발자라면 다 그렇게 생각하고 있지 않을까

자바에서 난수를 얻어내는 방법은 Random클래스를 활용하는 방법과 Math클래스를 활용하는 방법 2가지가 있습니다. 두 방법의 차이점은 Math.random() 메소드는 0.0에서 1사이의 double 난수를 얻는데만 사용한다면, Random 클래스는 boolean, int, long, float, double 난수를 얻을 수 있습니다. 또 Math.random()은 종자값(seed)가 현재시간으로 고정인 반면 Random클래스는 종자값(seed)을 설정 할 수 있습니다. 종자값은 난수를 만드는 알고리즘에 사용되는 값으로 종자값이 같으면 같은 난수를 얻습니다.

 Math.random() 

public class RandomExample { public static void main(String[] args) { System.out.println("0.0 ~ 1.0 사이의 난수 1개 발생 : " + Math.random()); System.out.println("0 ~ 10 사이의 난수 1개 발생 : " + (int)((Math.random()*10000)%10)); System.out.println("0 ~ 100 사이의 난수 1개 발생 : " + (int)(Math.random()*100)); } }

Math 클래스는 최상위 클래스인 Object 클래스 안에 있으므로 따로 Import를 시켜주지 않아도 사용이 가능하며 Math.random()메소드도 static메소드로 이루어져있기에 바로 호출할 수 있습니다. Math.random()의 메소드는 시드값으로 현재시간을 사용하므로 매번 실행시킬때마다 다른 숫자가 출력됩니다. Math.random() 메서드를 실행하면 실수형의 0.0 ~ 1.0 미만 사이의 무작위 실수값이 하나 리턴됩니다. 소수점 자리수가 무한한 무한소수의 형태로 출력되므로 무한에 가까운 경우의 수가 나타납니다. 정수형으로 가공을 하고 싶다면 나머지를 활용하는 방법 곱셈을 활용하는 방법 두가지 방법을 활용할 수 있습니다.

Math.random( )을 정수로 사용하기

1. random의 값을 충분히 높여준 뒤 나머지 연산을 합니다. 나머지 연산 값보다 무조건 작은값이 나옵니다.

2. random의 값을 원하는 자리수만큼 곱한 뒤 int형으로 변환하면 소수점 단위는 자동 절삭되어 정수형으로 표현이 가능합니다.

 Random 클래스 활용 

import java.util.Random; public class RandomExample { public static void main(String[] args) { Random random = new Random(); //랜덤 객체 생성(디폴트 시드값 : 현재시간) random.setSeed(System.currentTimeMillis()); //시드값 설정을 따로 할수도 있음 System.out.println("n 미만의 랜덤 정수 리턴 : " + random.nextInt(10)); System.out.println("무작위 boolean 값 : " + random.nextBoolean()); System.out.println("무작위 long 값 : " + random.nextLong()); System.out.println("무작위 float 값 : " + random.nextFloat()); System.out.println("무작위 double 값 : " + random.nextDouble()); System.out.println("무작위 정규 분포의 난수 값 :" + random.nextGaussian()); } }

Random 클래스는 java.util 패키지안에 있어 사용시 import가 필요하고 new를 통해 객체를 생성해주어야 합니다. 기본 생성자를 통해 Random객체를 생성하면 현재시간을 종자값으로 사용하고 setSeed메서드를 통해 시드값을 따로 설정해줄수도 있습니다.

Random클래스 주요 메서드

메서드 설명
setSeed(long n) 매개값으로 주어진 종자값이 설정됩니다.
boolean nextBoolean() boolean타입의 난수를 리턴합니다.
double nextDouble() doouble 타입의 난수를 리턴합니다.
int nextInt()  int 타입의 난수를 리턴합니다.
int nextInt(int n) int 타입의 0 ~ 매개값까지의 난수를 리턴합니다.
double nextGaussian() 평균이 0.0이고 표준편차가 1.0인 정규분포 난수를 리턴합니다.

 로또 번호 생성 

import java.util.Random; public class RandomExample { public static void main(String[] args) { Random rd = new Random();//랜덤 객체 생성 for(int i=0;i<6;i++) { System.out.print("["+(rd.nextInt(45)+1)+"]"); //로또번호 출력 } } }

Toplist

최신 우편물

태그