난수 범위와 섞기
범위가 제한된 난수와 컬렉션 섞기를 다룹니다
난수 범위와 섞기은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Java Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
범위와 섞기
실제 프로그램에서는 0부터 bound-1까지의 값만 필요한 경우가 드뭅니다. 이 레슨에서는 임의의 범위, 컬렉션을 무작위로 섞는 방법, 무작위 요소를 선택하는 방법을 다룹니다.
사용자 지정 범위 공식
min부터 max까지 양 끝값을 포함하는 int를 생성하려면 min + rng.nextInt(max - min + 1)을 사용하십시오.
import java.util.Random;
public class Main {
public static void main(String[] args) {
Random rng = new Random();
int min = 10, max = 20;
int value = min + rng.nextInt(max - min + 1);
System.out.println("10 to 20: " + value);
}
}시작점과 상한을 지정하는 nextInt
최신 Java에서는 nextInt(origin, bound)를 직접 호출할 수 있습니다. origin은 포함되고 bound는 포함되지 않습니다. 따라서 수동으로 공식을 작성할 필요가 없습니다.
import java.util.Random;
public class Main {
public static void main(String[] args) {
Random rng = new Random();
int value = rng.nextInt(10, 21);
System.out.println("10 to 20: " + value);
}
}범위 내 실수 난수
lo부터 hi까지의 실수를 얻으려면 lo + rng.nextDouble() * (hi - lo)를 사용하십시오.
import java.util.Random;
public class Main {
public static void main(String[] args) {
Random rng = new Random();
double lo = 5.0, hi = 7.5;
double value = lo + rng.nextDouble() * (hi - lo);
System.out.println(value);
}
}List 섞기
Collections.shuffle(list)는 List의 순서를 제자리에서 무작위로 바꿉니다. 카드 덱이나 무작위 퀴즈에 유용합니다.
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> deck = new ArrayList<>(List.of(1, 2, 3, 4, 5));
Collections.shuffle(deck);
System.out.println(deck);
}
}재현 가능한 섞기
시드가 설정된 Random을 두 번째 인수로 전달하면 결정적인 섞기를 수행할 수 있습니다. 예를 들어 Collections.shuffle(list, new Random(seed))과 같이 사용합니다.
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class Main {
public static void main(String[] args) {
List<Integer> deck = new ArrayList<>(List.of(1, 2, 3, 4, 5));
Collections.shuffle(deck, new Random(99));
System.out.println(deck);
}
}섞기에는 변경 가능한 List가 필요함
List.of(...)는 변경할 수 없는 목록을 만듭니다. 이 목록을 섞으면 UnsupportedOperationException이 발생합니다. 먼저 new ArrayList<>(...)로 감싸십시오.
무작위 요소 선택
무작위 인덱스를 생성한 다음 get을 사용하여 무작위 요소를 선택하십시오.
import java.util.List;
import java.util.Random;
public class Main {
public static void main(String[] args) {
List<String> colors = List.of("red", "green", "blue");
Random rng = new Random();
String pick = colors.get(rng.nextInt(colors.size()));
System.out.println("Chosen: " + pick);
}
}배열 섞기
배열에는 기본 제공 섞기 기능이 없습니다. 일반적인 방법은 Fisher-Yates 알고리즘입니다. 각 요소를 무작위로 선택한, 현재 위치보다 작거나 같은 인덱스의 요소와 교환합니다.
import java.util.Arrays;
import java.util.Random;
public class Main {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
Random rng = new Random(3);
for (int i = arr.length - 1; i > 0; i--) {
int j = rng.nextInt(i + 1);
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
System.out.println(Arrays.toString(arr));
}
}무작위 표본 추출
서로 다른 여러 항목을 선택하려면 복사본을 섞은 다음 앞에서 몇 개를 가져오거나, Set으로 이미 선택한 인덱스를 추적하십시오. 작은 목록에서는 섞은 후 일부를 가져오는 방법이 가장 간단합니다.
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> pool = new ArrayList<>(List.of(1, 2, 3, 4, 5, 6, 7, 8));
Collections.shuffle(pool);
List<Integer> sample = pool.subList(0, 3);
System.out.println("Sample: " + sample);
}
}실용적인 참고 사항
전체 순서를 무작위로 바꿔야 할 때는 섞기를 사용하고, 범위가 제한된 값이 필요할 때는 사용자 지정 범위 공식을 사용하십시오. 상한을 포함해야 할 때 1만큼 어긋나는 오류가 생기지 않도록 항상 주의하십시오.
빠른 확인
범위와 섞기에 대한 이해도를 확인해 보십시오.
복습
범위와 섞기를 배웠습니다.
- 범위에는
min + nextInt(max - min + 1)또는nextInt(origin, bound)를 사용하십시오. Collections.shuffle은 변경 가능한 목록의 순서를 제자리에서 바꿉니다.- 재현성을 위해 섞기에 시드를 설정하십시오.
- 무작위 인덱스를 통해 무작위 요소를 선택하십시오.
자주 묻는 질문
“난수 범위와 섞기” 강의는 무료인가요?
네 — “난수 범위와 섞기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“난수 범위와 섞기”에서 뭘 배우나요?
범위가 제한된 난수와 컬렉션 섞기를 다룹니다 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Java Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“난수 범위와 섞기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- Math 클래스
- 난수 생성
- 난수 범위와 섞기
- 수학적 반올림과 한계