2019λ…„ 6μ›” 15일 둜또 1λ“± λ‹Ήμ²¨λ²ˆν˜Έ

μ΄λ²ˆμ—λŠ” μžλ°”λ‘œ 둜또 번호 μžλ™ 생성기λ₯Ό λ§Œλ“€μ–΄λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

μžλ°”λ‘œ ν”„λ‘œκ·Έλž˜λ°μ„ ν•˜κΈ°μ „μ— μš°μ„  둜또의 κ·œμΉ™λΆ€ν„° μ•Œμ•„μ•Ό κ² μ£ .

λ‘œλ˜μ—λŠ” 1λΆ€ν„° 45κΉŒμ§€μ˜ μˆ«μžκ°€ μ‘΄μž¬ν•˜κ³ 

λ³΄λ„ˆμŠ€ 번호λ₯Ό ν¬ν•¨ν•˜μ—¬ 총 7개의 숫자λ₯Ό λžœλ€ν•˜κ²Œ λ½‘μŠ΅λ‹ˆλ‹€.

각 μˆ«μžλŠ” μ€‘λ³΅λ˜μ–΄ 선택할 수 μ—†μŠ΅λ‹ˆλ‹€.

μ—¬κΈ°μ„œ ν‚€ 포인트 λ‹¨μ–΄λŠ” λ°”λ‘œ 랜덀과 μ€‘볡 μž…λ‹ˆλ‹€.

μžλ°”μ—μ„œ 쀑볡을 μ œκ±°ν•˜λŠ” κ°€μž₯ 쒋은 방법은 Set을 μ΄μš©ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

 

자, 그럼 λžœλ€ν•˜κ²Œ 숫자λ₯Ό κ΅¬ν•˜λŠ” 것뢀터 해보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.

μžλ°”μ—μ„œ λžœλ€ν•œ 숫자λ₯Ό 얻을 λ•ŒλŠ” Math.random() λ©”μ„œλ“œλ₯Ό μ΄μš©ν•©λ‹ˆλ‹€.

그런데 이 λ©”μ„œλ“œλŠ” 0λΆ€ν„° 1μ‚¬μ΄μ˜ double ν˜•νƒœμ˜ μ†Œμˆ˜λ₯Ό λ¦¬ν„΄ν•΄μ€λ‹ˆλ‹€.

μ˜€μž‰?? 그럼 μ–΄λ–»κ²Œ 1λΆ€ν„° 45κΉŒμ§€μ˜ 숫자λ₯Ό μ–»λŠ”λ‹€λŠ” κ±ΈκΉŒμš”??

μ΄μ œλΆ€ν„° νŠΈλ¦­μ„ μ•Œλ €λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€.

 

Math.random()은 0보닀 ν¬κ±°λ‚˜ κ°™κ³  1보닀 μž‘μ€ 숫자λ₯Ό λ°˜ν™˜ν•΄μ€λ‹ˆλ‹€.

λ‚΄κ°€ μ–»κ³ μžν•˜λŠ” max숫자λ₯Ό κ³±ν•΄μ£Όλ©΄

0λΆ€ν„° maxκ°’ μ‚¬μ΄μ˜ double ν˜•νƒœμ˜ 숫자λ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

그럼 이 숫자λ₯Ό λ‹€μ‹œ intν˜•νƒœλ‘œ casting을 해버리면?

0<= μ›ν•˜λŠ” 숫자 < max μ‚¬μ΄μ˜ int 값을 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

 

예제λ₯Ό ν•œλ²ˆ λ³΄μ—¬λ“œλ¦¬λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

public static void main(String[] args) {
  getRandomNumber();
}
	
private static void getRandomNumber() {
  final int max = 46;
  for(int i = 0; i < 10; i++) {
    int randomNumber = (int)(Math.random() * max);
    System.out.println(randomNumber);
  }
}

μœ„ μ½”λ“œλ₯Ό μ‹€ν–‰μ‹œν‚€λ©΄ μ•„λž˜μ™€ 같은 κ²°κ³Όλ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

0
12
34
27
5
21
10
24
43

μœ„ κ²°κ³Όμ—λŠ” μ€‘λ³΅λœ μˆ«μžκ°€ λ‚˜μ˜€μ§€ μ•Šμ•˜μ§€λ§Œ

λͺ‡ 번 μ‹€ν–‰ν•˜λ‹€λ³΄λ©΄ λ™μΌν•œ μˆ«μžκ°€ μ—°μ†μœΌλ‘œ λ‚˜μ˜€λŠ” κ²½μš°λ„ μžˆμŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ 쀑볡을 μ œκ±°ν•΄μ£ΌλŠ” 과정이 ν•„μš”ν•˜κ²Œ λ©λ‹ˆλ‹€.

μ΄λ•Œ ν•„μš”ν•œ 것이 λ°”λ‘œ Setμž…λ‹ˆλ‹€.

Set은 μžλ°”μ—μ„œ 쀑볡을 μ œκ±°ν•˜κ³ μž ν•  λ•Œ μ•„μ£Ό μœ μš©ν•˜κ²Œ μ“°μ΄λŠ” μžλ£Œκ΅¬μ‘°μž…λ‹ˆλ‹€.

Set의 κ΅¬ν˜„μ²΄λŠ” μ—¬λŸ¬κ°€μ§€κ°€ μžˆλŠ”λ° 일반적으둜 많이 μ“°μ΄λŠ” 것은 HashSetμž…λ‹ˆλ‹€.

μ•„λž˜ 예제 μ½”λ“œλ₯Ό ν•œλ²ˆ λ³΄κ² μŠ΅λ‹ˆλ‹€.

public static void main(String[] args) {
  removeDuplicate();
}
	
private static void removeDuplicate() {
  Set<Integer> noDuplicated = new HashSet<>();
  noDuplicated.add(30);
  noDuplicated.add(30);
  noDuplicated.add(31);
  System.out.println(noDuplicated);
}

μœ„ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄ μ•„λž˜μ™€ 같이 좜λ ₯λ©λ‹ˆλ‹€.

[30, 31]

λ³΄μ‹œλŠ” 바와 같이 30을 두 번 add ν–ˆλŠ”λ° 1개만 μ €μž₯이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

이것을 μ΄μš©ν•΄μ„œ 이미 뽑은 μˆ«μžλŠ” μ €μž₯ν•˜μ§€ μ•Šκ³  μƒˆλ‘œμš΄ 번호λ₯Ό 뽑도둝 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

μ•„λž˜λŠ” μ™„μ„±λœ 둜또 번호 μƒμ„±κΈ°μ˜ μƒ˜ν”Œμž…λ‹ˆλ‹€.

private static void lotto() {
  final int min = 1;
  final int max = 45;
		
  Set<Integer> selected = new HashSet<>();
  while(true) {
    int randomNumber = (int)(Math.random() * (max - min +1) + min);
    if(selected.add(randomNumber)) {
      if(selected.size() == 6) {
        break;
      }
    }
  }
  System.out.println(selected.stream().sorted().collect(Collectors.toList()));
}

μœ„ λ©”μ„œλ“œλ₯Ό main ν•¨μˆ˜μ—μ„œ μ‹€ν–‰μ‹œν‚€λ©΄

1~45κΉŒμ§€μ˜ μˆ«μžλ“€ μ€‘μ—μ„œ μ€‘λ³΅λ˜μ§€ μ•Šμ€ 6개의 숫자λ₯Ό 좜λ ₯ν•΄μ€λ‹ˆλ‹€.

랜덀 번호 μƒμ„±ν•˜λŠ” 뢀뢄이 쑰금 μˆ˜μ •λœ 것을 λˆˆμΉ˜μ±„μ…¨λ‚˜μš”?

μ € μœ„μ—μ„œ λ³΄μ—¬λ“œλ¦° λ‘œμ§μœΌλ‘œλŠ” 0이 λ‚˜μ˜¬ 수 있기 λ•Œλ¬Έμ— μˆ˜μ •μ„ ν•œ κ²ƒμž…λ‹ˆλ‹€.

μžλ°”λ‘œ 랜덀 숫자 κ΅¬ν•˜λŠ” 방법에 λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ 랜덀 숫자 κ΅¬ν•˜κΈ° μ—μ„œ ν™•μΈν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

μœ„ λ©”μ„œλ“œλ₯Ό 10번 μ‹€ν–‰ν•œ κ²°κ³ΌλŠ” μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

[5, 17, 18, 25, 29, 33]
[9, 13, 16, 26, 30, 34]
[21, 24, 27, 30, 31, 42]
[9, 15, 17, 34, 36, 42]
[2, 3, 15, 35, 38, 41]
[8, 16, 30, 31, 36, 39]
[1, 5, 11, 40, 43, 44]
[1, 3, 4, 18, 21, 39]
[4, 7, 19, 28, 38, 40]
[7, 9, 14, 18, 30, 41]

μ΄μƒμœΌλ‘œ μžλ°”λ‘œ μ‹¬ν”Œν•œ 둜또 번호 μžλ™ 생성기 λ§Œλ“€κΈ° ν¬μŠ€νŒ…μ„ λ§ˆμΉ˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

κΆκΈˆν•œ 점이 μžˆμœΌμ‹œλ©΄ λŒ“κΈ€ λ‹¬μ•„μ£Όμ‹œκ³ ,

ν¬μŠ€νŒ… λ‚΄μš©μ΄ 도움이 λ˜μ…¨λ‹€λ©΄ 곡감 κΎΉ λΆ€νƒν•΄μš” ^-^