C++/기타

[C++] 랜덀 숫자 random number

Chan Lee 2023. 12. 16. 14:53

C++μ—μ„œ λžœλ€ν•œ 숫자λ₯Ό μ–»λŠ” 법을 μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

μš°μ„ , 저희가 μ‚¬μš©ν•  ν•¨μˆ˜λ“€μ΄ ν¬ν•¨λœ <cstdlib> ν—€λ”λ₯Ό ν¬ν•¨μ‹œν‚΅λ‹ˆλ‹€. 

(좔가적인 μ •λ³΄λŠ” https://en.cppreference.com/w/cpp/header/cstdlib μ— μžˆμŠ΅λ‹ˆλ‹€.)

#include <iostream>
#include <cstdlib>	// cstdlib 헀더 μΆ”κ°€

 

그리고 저희가 μ›ν•˜λŠ” 랜덀 숫자의 λ²”μœ„λ₯Ό μ„ νƒν•˜κΈ° μœ„ν•œ 두가지 λ³€μˆ˜λ₯Ό μ„ μ–Έν•©λ‹ˆλ‹€.

μ €λŠ” μ£Όμ‚¬μœ„μ—μ„œ 처럼 1κ³Ό 6을 κ³ λ₯΄κ² μŠ΅λ‹ˆλ‹€.

μ£Όμ˜ν•  점은 1κ³Ό 6이 μ œμ™Έλœ 2-5의 λ²”μœ„κ°€ λŒ€μƒμ΄ μ•„λ‹ˆκ³ , 1κ³Ό 6을 ν¬ν•¨ν•΄μ„œ 1~6 μ‚¬μ΄μ—μ„œ μˆ«μžκ°€ κ²°μ •λ©λ‹ˆλ‹€.

(이름은 μ›ν•˜μ‹œλŠ”λŒ€λ‘œ ν•˜λ©΄ λ©λ‹ˆλ‹€.)

 

λ‹€μŒμœΌλ‘œλŠ” λͺ‡λ²ˆμ˜ 숫자λ₯Ό 좜λ ₯ν•˜κ³  싢은지λ₯Ό μ„ μ–Έν•©λ‹ˆλ‹€.

이 방법은 κΌ­ μ„ μ–ΈμœΌλ‘œ ν•˜μ§€ μ•Šλ”λΌλ„ forλ¬Έ λ“± λ‹€μ–‘ν•œ 방법이 μžˆμœΌλ‚˜, 

μ΄ν•΄ν•˜κΈ° μ‰½κ²Œ λ³€μˆ˜ μ„ μ–ΈμœΌλ‘œ ν•˜κ² μŠ΅λ‹ˆλ‹€.

int min {1};	// 랜덀 숫자 μ΅œμ†Œ λ²”μœ„ 
int max {6};	// 랜덀 숫자 μ΅œλŒ€ λ²”μœ„

int count {10}	// 총 10번 랜덀 숫자λ₯Ό λ°›κ² μŠ΅λ‹ˆλ‹€.

 

λ‹€μŒμœΌλ‘œλŠ” μ€‘μš”ν•œ 뢀뢄인데, 랜덀 ν•¨μˆ˜μ˜ μ‹œλ“œλ₯Ό μ§€μ •ν•΄μ•Όν•©λ‹ˆλ‹€.

μ‹œλ“œλ₯Ό 지정해주지 μ•Šμ€ μƒνƒœλ‘œ 랜덀 ν•¨μˆ˜κ°€ ν¬ν•¨λœ ν”„λ‘œκ·Έλž¨μ„ μ‚¬μš©ν•˜κ²Œ 되면, 

sequence, 즉 μˆœμ„œκ°€ λ™μΌν•œ 랜덀 μˆ«μžκ°€ 계속 λ‚˜μ˜΅λ‹ˆλ‹€.

λͺ‡λ²ˆμ΄κ³  ν”„λ‘œκ·Έλž¨μ„ 싀행해도 같은 κ²°κ³Όκ°€ λ‚˜μ˜¨λ‹€λŠ” λœ»μž…λ‹ˆλ‹€.

 

이런 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄, μ‹€ν–‰ν•  λ•Œ λ§ˆλ‹€ λ°”λ€ŒλŠ” 정보인 μ‹œκ°„ 정보λ₯Ό μ΄μš©ν•˜κ² μŠ΅λ‹ˆλ‹€.

λ‹€μ‹œ 처음으둜 λŒμ•„κ°€μ„œ <ctime> 헀더λ₯Ό ν¬ν•¨ν•΄μ€λ‹ˆλ‹€.

ν•΄λ‹Ή ν—€λ”λŠ” timeκ³Ό 같은 μ‹œκ°„κ³Ό κ΄€λ ¨λœ ν•¨μˆ˜λ“€μ„ μ‚¬μš©ν•˜κ²Œ ν•΄μ€λ‹ˆλ‹€.

#include <ctime>

 

그리고 srand(time(nullptr)) 을 톡해 μ‹€ν–‰μ‹œλ§ˆλ‹€ λ‹¬λΌμ§€λŠ” ν˜„μž¬ μ‹œκ°„μ„ 기반으둜 랜덀 μ‹œλ“œλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.

srand()λŠ” 랜덀 μ‹œλ“œλ₯Ό μ„€μ •ν•˜λŠ” μ—­ν• μž…λ‹ˆλ‹€.

time(nullptr))은 ν˜„μž¬ μ‹œκ°„μ„ μ •μˆ˜λ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.

( time(0)으둜 μ‚¬μš©ν•΄λ„ λ¬΄λ°©ν•©λ‹ˆλ‹€. )

srand(time(nullptr))

 

이제 μ‹œλ“œ 섀정이 λλ‚¬μœΌλ‹ˆ 랜덀 숫자λ₯Ό λ°›κΈ°λ§Œ ν•˜λ©΄ λ©λ‹ˆλ‹€.

이후, μ•„κΉŒ μ„€μ •ν•œ 랜덀 좜λ ₯ 횟수인 count 수 만큼 for문을 λ°˜λ³΅μ‹œν‚€κ² μŠ΅λ‹ˆλ‹€.

그리고 for λ¬Έ λ‚΄λΆ€μ—μ„œ, rand() % max + min μ„ 톡해 랜덀 λ„˜λ²„λ₯Ό 받을 κ²ƒμž…λ‹ˆλ‹€.

rand()λŠ” 0λΆ€ν„° RAND_MAX κΉŒμ§€μ˜ 랜덀 μ •μˆ˜λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

(RAND_MAX값은 κΈ°κΈ°λ§ˆλ‹€ λ‹€λ¦…λ‹ˆλ‹€. 제 κ²½μš°λŠ” 2147483647 μ΄λ„€μš”.)

 

즉 (0 - 2147483647) % max(6) = (0 ~ 5)의 κ°’μž…λ‹ˆλ‹€.

μ—¬κΈ°μ„œ μš°λ¦¬λŠ” (1 ~ 6)의 값을 μ–»κΈΈ μ›ν–ˆκΈ° λ•Œλ¬Έμ—, 처음 μ„€μ •ν•œ min κ°’, 1을 λ”ν•©λ‹ˆλ‹€.

그러면 (1 ~ 6)의 랜덀 값을 받을 수 있겠죠?

 

이 λͺ¨λ“  κ±Έ ν•©μΉœ μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

#include <cstdlib>
#include <ctime>
#include <iostream>
using namespace std;

int main() {
  int min{1};
  int max{6};
  int count{10};

  srand(time(nullptr));

  for (size_t i{1}; i <= count; i++) {
    int rand_num{rand() % max + min};
    cout << rand_num << endl;
  }

  return 0;
}

 

랜덀 숫자λ₯Ό 받을 λ•Œ, 'rand() ν•¨μˆ˜ 이전에 srand(time(nullptr))둜 μ‹œλ“œλ₯Ό μ§€μ •ν•œλ‹€'

λ₯Ό μ΄ν•΄ν•˜λŠ” 것이 μ€‘μš”ν•œ μ½”λ“œμ˜€μŠ΅λ‹ˆλ‹€.


 

μ‹€ν–‰ κ²°κ³Ό

μ‹€ν–‰ κ²°κ³Ό