웹사이트 검색

Java의 난수 생성기


오늘은 Java에서 난수를 생성하는 방법을 살펴보겠습니다. 때때로 우리는 Java 프로그램에서 난수를 생성해야 합니다. 예를 들어, 주사위 게임을 하거나 암호화를 위한 임의의 키 ID를 생성하는 것 등입니다.

Java의 난수 생성기

  1. java.util.Random 클래스를 사용하여 난수를 생성할 수 있습니다. 임의의 정수, long, double 등을 생성하는 여러 가지 방법을 제공합니다.
  2. Math.random()을 사용하여 double을 생성할 수도 있습니다. 이 메서드는 내부적으로 Java Random 클래스를 사용합니다.
  3. java.util.concurrent.ThreadLocalRandom 클래스는 다중 스레드 환경에서 난수를 생성하는 데 사용해야 합니다. 이 클래스는 Java Concurrent 패키지의 일부이며 Java 1.7에서 도입되었습니다. 이 클래스에는 Java Random 클래스와 유사한 메서드가 있습니다.
  4. java.security.SecureRandom은 강력한 보안으로 난수를 생성하는 데 사용할 수 있습니다. 이 클래스는 암호학적으로 강력한 난수 생성기를 제공합니다. 그러나 처리 속도가 느립니다. 따라서 애플리케이션 요구 사항에 따라 사용 여부를 결정해야 합니다.

자바 난수 생성기

Java에서 난수를 생성하는 몇 가지 예를 살펴보겠습니다. 나중에 ThreadLocalRandom 및 SecureRandom 예제 프로그램도 살펴보겠습니다.

1. 임의의 정수 생성

Random random = new Random();

int rand = random.nextInt();

예, Java에서 임의의 정수를 생성하는 것은 간단합니다. Random 인스턴스를 생성하면 모든 nextXXX 메서드 호출에 사용되는 긴 시드 값이 생성됩니다. 프로그램에서 이 시드 값을 설정할 수 있지만 대부분의 경우 필요하지 않습니다.

//set the long seed value using Random constructor
Random random = new Random(123456789);

//set long seed value using setter method
Random random1 = new Random();
random1.setSeed(1234567890);

2. 1에서 10 사이의 자바 난수

때로는 범위 사이에서 임의의 숫자를 생성해야 합니다. 예를 들어, 주사위 게임에서 가능한 값은 1에서 6까지만 가능합니다. 아래는 1에서 10 사이의 난수를 생성하는 방법을 보여주는 코드입니다.

Random random = new Random();
int rand = 0;
while (true){
    rand = random.nextInt(11);
    if(rand !=0) break;
}
System.out.println(rand);

nextInt(int x)의 인자는 제외되었으므로 11로 인자를 제공해야 합니다. 또한 생성된 난수에는 0이 포함되어 있으므로 얻을 때까지 nextInt 메서드를 계속 호출해야 합니다. 1에서 10 사이의 값. 위의 코드를 확장하여 주어진 범위 내에서 난수를 생성할 수 있습니다.

3. 랜덤 더블 생성

Math.random() 또는 Random 클래스 nextDouble 메서드를 사용하여 Java에서 임의의 이중 숫자를 생성할 수 있습니다.

Random random = new Random();

double d = random.nextDouble();

double d1 = Math.random();

4. 랜덤 플로트 생성

Random random = new Random();

float f = random.nextFloat();

5. 랜덤 롱 생성

Random random = new Random();

long l = random.nextLong();

6. 임의 부울 생성

Random random = new Random();

boolean flag = random.nextBoolean();

7. 임의 바이트 배열 생성

임의의 바이트를 생성하고 Random 클래스를 사용하여 사용자 제공 바이트 배열에 배치할 수 있습니다. 생성된 임의 바이트 수는 바이트 배열의 길이와 같습니다.

Random random = new Random();

byte[] randomByteArray = new byte[5];

random.nextBytes(randomByteArray);

System.out.println(Arrays.toString(randomByteArray)); // sample output [-70, -57, 74, 99, -78]

8. 다중 스레드 환경의 ThreadLocalRandom

다음은 다중 스레드 환경에서 ThreadLocalRandom 사용을 보여주는 간단한 예입니다.

package com.journaldev.randomnumber;

import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;

public class ThreadLocalRandomExample {

	public static void main(String[] args) {
		Runnable runnable = new MyRunnable();

		for (int i = 0; i < 5; i++) {
			Thread t = new Thread(runnable);
			t.setName("MyRunnable-Thread-" + i);
			t.start();
		}
	}

}

class MyRunnable implements Runnable {

	@Override
	public void run() {
		String threadName = Thread.currentThread().getName();
		System.out.println(threadName + "::" + ThreadLocalRandom.current().nextInt());
	}

}

아래는 위 프로그램을 실행한 샘플 출력입니다.

MyRunnable-Thread-0::-1744088963
MyRunnable-Thread-3::139405798
MyRunnable-Thread-1::1403710182
MyRunnable-Thread-2::-1222080205
MyRunnable-Thread-4::-185825276
ThreadLocalRandom random = ThreadLocalRandom.current();
		
int rand = random.nextInt(1, 11);

ThreadLocalRandom에는 임의의 long 및 double 값을 생성하는 유사한 방법이 있습니다.

9. SecureRandom 예제

SecureRandom 클래스를 사용하여 나열된 공급자를 사용하여 보다 안전한 난수를 생성할 수 있습니다. 빠른 SecureRandom 예제 코드가 아래에 나와 있습니다.

Random random = new SecureRandom();

int rand = random.nextInt();

System.out.println(rand);

이것이 Java 프로그램에서 임의의 숫자를 생성하는 것입니다.

GitHub 리포지토리에서 예제 코드를 다운로드할 수 있습니다.