Java에서의 난수 생성기

오늘은 Java에서 무작위 숫자를 생성하는 방법을 살펴볼 것입니다. 때로는 Java 프로그램에서 무작위 숫자를 생성해야 할 때가 있습니다. 예를 들어, 주사위 게임이나 암호화를 위한 무작위 키 ID를 생성해야 할 때 등이 있습니다.

Java에서 무작위 숫자 생성기

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은 강력한 보안을 제공하는 무작위 숫자를 생성하는 데 사용할 수 있습니다. 이 클래스는 암호학적으로 강력한 무작위 숫자 생성기를 제공합니다. 그러나 처리 속도가 느립니다. 따라서 응용 프로그램 요구 사항에 따라 사용할지 여부를 결정해야 합니다.

자바 난수 생성기

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

1. 난수 정수 생성

Random random = new Random();

int rand = random.nextInt();

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

// Random 생성자를 사용하여 긴 시드 값을 설정
Random random = new Random(123456789);

// setter 메서드를 사용하여 긴 시드 값을 설정
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이 포함되므로 1에서 10 사이의 값이 나올 때까지 nextInt 메서드를 계속 호출해야합니다. 위의 코드를 사용하여 주어진 범위 내에서 임의의 난수를 생성할 수 있습니다.

3. 무작위 double 생성

우리는 Math.random() 또는 Random 클래스의 nextDouble 메서드를 사용하여 자바에서 무작위 double 숫자를 생성할 수 있습니다.

Random random = new Random();

double d = random.nextDouble();

double d1 = Math.random();

4. 무작위 float 생성

Random random = new Random();

float f = random.nextFloat();

5. 무작위 long 생성

Random random = new Random();

long l = random.nextLong();

6. 무작위 boolean 생성

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 인스턴스에 시드 값을 설정할 수 없으며, 이렇게 하면 UnsupportedOperationException이 발생합니다. 또한 ThreadLocalRandom 클래스에는 범위 내의 랜덤 숫자를 생성하는 몇 가지 추가 유틸리티 메서드도 있습니다. 예를 들어, 1에서 10 사이의 랜덤 숫자를 생성하려면 다음과 같이 할 수 있습니다.

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);

이것이 자바 프로그램에서 무작위 숫자를 생성하는 방법입니다.

예제 코드는 GitHub Repository에서 다운로드할 수 있습니다.

Source:
https://www.digitalocean.com/community/tutorials/random-number-generator-java