๐ŸŽฒ ๋‚œ์ˆ˜ ์ƒ์„ฑ: ์„ ํ˜• ํ•ฉ๋™ ์ƒ์„ฑ๊ธฐ ๊ตฌํ˜„ ๐ŸŽฒ

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐ŸŽฒ ๋‚œ์ˆ˜ ์ƒ์„ฑ: ์„ ํ˜• ํ•ฉ๋™ ์ƒ์„ฑ๊ธฐ ๊ตฌํ˜„ ๐ŸŽฒ

 

 

์•ˆ๋…•, ์นœ๊ตฌ๋“ค! ์˜ค๋Š˜์€ ์ •๋ง ์žฌ๋ฏธ์žˆ๋Š” ์ฃผ์ œ๋กœ ์ด์•ผ๊ธฐ๋ฅผ ๋‚˜๋ˆ ๋ณผ ๊ฑฐ์•ผ. ๋ฐ”๋กœ ๋‚œ์ˆ˜ ์ƒ์„ฑ์— ๋Œ€ํ•ด์„œ ๋ง์ด์ง€. ํŠนํžˆ ์šฐ๋ฆฌ๊ฐ€ ์ง‘์ค‘์ ์œผ๋กœ ์‚ดํŽด๋ณผ ๊ฑด ์„ ํ˜• ํ•ฉ๋™ ์ƒ์„ฑ๊ธฐ(Linear Congruential Generator, LCG)๋ผ๋Š” ๋…€์„์ด์•ผ. ์ด๊ฒŒ ๋ญ”์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค๊ณ ? ๊ฑฑ์ • ๋งˆ! ๋‚ด๊ฐ€ ์‰ฝ๊ณ  ์žฌ๋ฏธ์žˆ๊ฒŒ ์„ค๋ช…ํ•ด์ค„๊ฒŒ. ๐Ÿ˜‰

์šฐ๋ฆฌ๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ๋•Œ, ํŠนํžˆ ๊ฒŒ์ž„์ด๋‚˜ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๊ฐ™์€ ๊ฑธ ๋งŒ๋“ค ๋•Œ ๋ฌด์ž‘์œ„์„ฑ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ฃผ์‚ฌ์œ„๋ฅผ ๊ตด๋ฆฌ๊ฑฐ๋‚˜ ์นด๋“œ๋ฅผ ์„ž๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์•ผ. ์ด๋Ÿฐ ๋ฌด์ž‘์œ„์„ฑ์„ ์ปดํ“จํ„ฐ์—์„œ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ? ๋ฐ”๋กœ ์—ฌ๊ธฐ์„œ ๋‚œ์ˆ˜ ์ƒ์„ฑ์ด ๋“ฑ์žฅํ•˜๋Š” ๊ฑฐ์ง€!

๊ทธ๋Ÿฐ๋ฐ ๋ง์ด์•ผ, ์ปดํ“จํ„ฐ๋Š” ์‚ฌ์‹ค ์ง„์ •ํ•œ ์˜๋ฏธ์˜ '๋ฌด์ž‘์œ„'๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๊ธฐ ์–ด๋ ค์›Œ. ์™œ๋ƒํ•˜๋ฉด ์ปดํ“จํ„ฐ๋Š” ์ •ํ•ด์ง„ ๊ทœ์น™์— ๋”ฐ๋ผ ๋™์ž‘ํ•˜๋Š” ๊ธฐ๊ณ„๋‹ˆ๊นŒ. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” '์˜์‚ฌ ๋‚œ์ˆ˜(Pseudo-random numbers)'๋ผ๋Š” ๊ฑธ ์‚ฌ์šฉํ•ด. ์ด๊ฒŒ ๋ฐ”๋กœ ์„ ํ˜• ํ•ฉ๋™ ์ƒ์„ฑ๊ธฐ๊ฐ€ ํ•˜๋Š” ์ผ์ด์•ผ!

๐Ÿค” ์ž ๊น! ์˜์‚ฌ ๋‚œ์ˆ˜๊ฐ€ ๋ญ๋ƒ๊ณ ?

์˜์‚ฌ ๋‚œ์ˆ˜๋Š” ์ง„์งœ ๋ฌด์ž‘์œ„๋Š” ์•„๋‹ˆ์ง€๋งŒ, ํ†ต๊ณ„์ ์œผ๋กœ ๋ฌด์ž‘์œ„์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ์ˆ˜์—ด์„ ๋งํ•ด. ์ถฉ๋ถ„ํžˆ ๊ธธ๊ณ  ๋ณต์žกํ•ด์„œ ์˜ˆ์ธกํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“  ์ˆ˜์—ด์ด์ง€. ๋งˆ์น˜ ์ง„์งœ ์ฃผ์‚ฌ์œ„๋ฅผ ๋˜์ง„ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•˜๋Š” ๊ฑฐ์•ผ!

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์„ ํ˜• ํ•ฉ๋™ ์ƒ์„ฑ๊ธฐ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. ์ด ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•˜๋ฉด์„œ๋„ ํšจ๊ณผ์ ์ด์–ด์„œ ๋งŽ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ์‹œ์Šคํ…œ์—์„œ ๊ธฐ๋ณธ ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์–ด. C ์–ธ์–ด๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ํŠนํžˆ ์ข‹์ง€. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ์˜ ์žฌ๋Šฅ๋„ท ์‚ฌ์ดํŠธ์—์„œ๋„ ์ด๋Ÿฐ ๊ธฐ์ˆ ์„ ํ™œ์šฉํ•œ ํ”„๋กœ์ ํŠธ๋“ค์ด ์ข…์ข… ์˜ฌ๋ผ์˜ค๊ณค ํ•ด. ๐Ÿ˜Š

๐Ÿ”ข ์„ ํ˜• ํ•ฉ๋™ ์ƒ์„ฑ๊ธฐ์˜ ์›๋ฆฌ

์„ ํ˜• ํ•ฉ๋™ ์ƒ์„ฑ๊ธฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆ˜ํ•™์  ๊ณต์‹์„ ์‚ฌ์šฉํ•ด:

Xn+1 = (aXn + c) mod m

์–ด, ์ด๊ฒŒ ๋ญ” ์†Œ๋ฆฌ๋ƒ๊ณ ? ๊ฑฑ์ • ๋งˆ! ํ•˜๋‚˜์”ฉ ์ฐจ๊ทผ์ฐจ๊ทผ ์„ค๋ช…ํ•ด์ค„๊ฒŒ. ๐Ÿ˜Ž

  • ๐Ÿ”ธ Xn: ํ˜„์žฌ์˜ ๋‚œ์ˆ˜
  • ๐Ÿ”ธ Xn+1: ๋‹ค์Œ์— ์ƒ์„ฑ๋  ๋‚œ์ˆ˜
  • ๐Ÿ”ธ a: ๊ณฑ์ˆ˜ (multiplier)
  • ๐Ÿ”ธ c: ์ฆ๋ถ„ (increment)
  • ๐Ÿ”ธ m: ๋ชจ๋“ˆ๋Ÿฌ (๋‚˜๋ˆ—์…ˆ์˜ ์ œ์ˆ˜)

์ด ๊ณต์‹์„ ์‚ฌ์šฉํ•˜๋ฉด, ์ด์ „์— ์ƒ์„ฑ๋œ ๋‚œ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๋‹ค์Œ ๋‚œ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ฑฐ์•ผ. ๋งˆ์น˜ ์ฃผ์‚ฌ์œ„๋ฅผ ๊ณ„์† ๊ตด๋ฆฌ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์ง€. ๊ทธ๋Ÿฐ๋ฐ ์ด '์ฃผ์‚ฌ์œ„'๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ •ํ•œ ๊ทœ์น™์— ๋”ฐ๋ผ ๊ตด๋Ÿฌ๊ฐ€๋Š” ํŠน๋ณ„ํ•œ ์ฃผ์‚ฌ์œ„์ธ ์…ˆ์ด์•ผ.

๐Ÿ’ก ์žฌ๋ฏธ์žˆ๋Š” ์‚ฌ์‹ค: ์ด ๋ฐฉ๋ฒ•์€ 1951๋…„์— D. H. Lehmer๊ฐ€ ์ฒ˜์Œ ์ œ์•ˆํ–ˆ์–ด. ์ปดํ“จํ„ฐ๊ฐ€ ์ง€๊ธˆ์ฒ˜๋Ÿผ ๋ฐœ์ „ํ•˜๊ธฐ ํ›จ์”ฌ ์ „์ด์ง€. ๊ทธ ๋•Œ๋ถ€ํ„ฐ ์ง€๊ธˆ๊นŒ์ง€ ๊ณ„์† ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค๋‹ˆ, ์ •๋ง ๋Œ€๋‹จํ•˜์ง€ ์•Š์•„?

์ž, ์ด์ œ ์ด ๊ณต์‹์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์ข€ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ’์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•ด๋ณด์ž:

  • ๐Ÿ”ข a = 1103
  • ๐Ÿ”ข c = 12345
  • ๐Ÿ”ข m = 2^31 - 1 (์ด๊ฑด 2147483647์ด๋ผ๋Š” ํฐ ์†Œ์ˆ˜์•ผ)

๊ทธ๋ฆฌ๊ณ  ์‹œ์ž‘๊ฐ’(seed)์œผ๋กœ X0 = 1์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•˜์ž. ๊ทธ๋Ÿฌ๋ฉด ์ฒซ ๋ฒˆ์งธ ๋‚œ์ˆ˜๋Š” ์ด๋ ‡๊ฒŒ ๊ณ„์‚ฐ๋ผ:

X1 = (1103 * 1 + 12345) mod 2147483647 = 13448

์™€! ์šฐ๋ฆฌ์˜ ์ฒซ ๋ฒˆ์งธ ๋‚œ์ˆ˜๊ฐ€ ํƒ„์ƒํ–ˆ์–ด! ๐ŸŽ‰ ์ด์ œ ์ด 13448์„ ๋‹ค์‹œ ๊ณต์‹์— ๋„ฃ์–ด์„œ ๋‹ค์Œ ๋‚œ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ , ๋˜ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ทธ ๋‹ค์Œ ๋‚œ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ ... ์ด๋ ‡๊ฒŒ ๊ณ„์† ์ด์–ด๋‚˜๊ฐ€๋Š” ๊ฑฐ์•ผ.

๐Ÿ–ฅ๏ธ C ์–ธ์–ด๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ

์ž, ์ด์ œ ์ด ๊ฐœ๋…์„ ์‹ค์ œ C ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•ด๋ณด์ž. ์—ฌ๊ธฐ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์ค€๋น„ํ–ˆ์–ด:


#include <stdio.h>
#include <stdint.h>

#define A 1103515245
#define C 12345
#define M 2147483648

uint32_t seed = 1;

uint32_t rand() {
    seed = (A * seed + C) % M;
    return seed;
}

int main() {
    for (int i = 0; i < 10; i++) {
        printf("%u\n", rand());
    }
    return 0;
}

์šฐ์™€, ์ฝ”๋“œ๊ฐ€ ์ข€ ๋ณต์žกํ•ด ๋ณด์ด์ง€? ๊ฑฑ์ • ๋งˆ! ํ•˜๋‚˜์”ฉ ๋œฏ์–ด์„œ ์„ค๋ช…ํ•ด์ค„๊ฒŒ. ๐Ÿ˜Š

  1. #include ๋ถ€๋ถ„: ํ•„์š”ํ•œ ํ—ค๋” ํŒŒ์ผ์„ ํฌํ•จ์‹œํ‚ค๋Š” ๊ฑฐ์•ผ. stdio.h๋Š” ์ž…์ถœ๋ ฅ์„, stdint.h๋Š” ์ •์ˆ˜ ํƒ€์ž…์„ ์œ„ํ•ด ํ•„์š”ํ•ด.
  2. #define ๋ถ€๋ถ„: ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  ์ƒ์ˆ˜๋“ค์„ ์ •์˜ํ•˜๊ณ  ์žˆ์–ด. A, C, M์ด ๋ฐ”๋กœ ๊ทธ ๊ณต์‹์—์„œ ๋ดค๋˜ ๊ฐ’๋“ค์ด์ง€!
  3. uint32_t seed = 1;: ์‹œ์ž‘๊ฐ’(seed)์„ 1๋กœ ์„ค์ •ํ•˜๊ณ  ์žˆ์–ด. ์ด ๊ฐ’์„ ๋ฐ”๊พธ๋ฉด ๋‹ค๋ฅธ ๋‚œ์ˆ˜ ์‹œํ€€์Šค๊ฐ€ ์ƒ์„ฑ๋ผ.
  4. uint32_t rand() ํ•จ์ˆ˜: ์ด๊ฒŒ ๋ฐ”๋กœ ์šฐ๋ฆฌ์˜ ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ์•ผ! ๊ณต์‹์„ ๊ทธ๋Œ€๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์ง€.
  5. main() ํ•จ์ˆ˜: ์—ฌ๊ธฐ์„œ๋Š” ์šฐ๋ฆฌ์˜ ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ๋ฅผ 10๋ฒˆ ํ˜ธ์ถœํ•ด์„œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์žˆ์–ด.

์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, 10๊ฐœ์˜ '๋ฌด์ž‘์œ„' ์ˆซ์ž๊ฐ€ ์ถœ๋ ฅ๋  ๊ฑฐ์•ผ. ํ•˜์ง€๋งŒ ์ด ์ˆซ์ž๋“ค์€ ์‚ฌ์‹ค ์™„์ „ํžˆ ๋ฌด์ž‘์œ„๊ฐ€ ์•„๋‹ˆ๋ผ, ์šฐ๋ฆฌ๊ฐ€ ์ •ํ•œ ๊ทœ์น™์— ๋”ฐ๋ผ ์ƒ์„ฑ๋œ ๊ฑฐ์ง€. ๊ทธ๋ž˜์„œ ์ด๊ฑธ '์˜์‚ฌ ๋‚œ์ˆ˜'๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฑฐ์•ผ.

๐ŸŒŸ ๊ฟ€ํŒ: ์ด ์ฝ”๋“œ๋ฅผ ์žฌ๋Šฅ๋„ท์— ์˜ฌ๋ ค์„œ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค๊ณผ ๊ณต์œ ํ•ด๋ณด๋Š” ๊ฑด ์–ด๋•Œ? ์•„๋‹ˆ๋ฉด ์ด๋ฅผ ์‘์šฉํ•œ ์žฌ๋ฏธ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณผ ์ˆ˜๋„ ์žˆ๊ฒ ์ง€. ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ๋ฅผ ์ด์šฉํ•œ ๊ฐ„๋‹จํ•œ ๊ฒŒ์ž„์ด๋ผ๋“ ๊ฐ€, ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ”„๋กœ๊ทธ๋žจ ๊ฐ™์€ ๊ฑธ ๋ง์ด์•ผ!

๐ŸŽจ ์„ ํ˜• ํ•ฉ๋™ ์ƒ์„ฑ๊ธฐ์˜ ์‹œ๊ฐํ™”

๋ง๋กœ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ˆˆ์œผ๋กœ ๋ณด๋Š” ๊ฒŒ ๋” ์ดํ•ด๊ฐ€ ์‰ฌ์šธ ๋•Œ๊ฐ€ ์žˆ์ง€. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ์˜ ์„ ํ˜• ํ•ฉ๋™ ์ƒ์„ฑ๊ธฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œํ˜„ํ•ด๋ดค์–ด. ํ•œ๋ฒˆ ๋ณผ๊นŒ?

์„ ํ˜• ํ•ฉ๋™ ์ƒ์„ฑ๊ธฐ ์‹œ๊ฐํ™” ์ƒ์„ฑ ์ˆœ์„œ ๋‚œ์ˆ˜ ๊ฐ’

์ด ๊ทธ๋ž˜ํ”„๋Š” ์šฐ๋ฆฌ์˜ ์„ ํ˜• ํ•ฉ๋™ ์ƒ์„ฑ๊ธฐ๊ฐ€ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๋‚œ์ˆ˜๋“ค์„ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์–ด. X์ถ•์€ ๋‚œ์ˆ˜๊ฐ€ ์ƒ์„ฑ๋œ ์ˆœ์„œ๋ฅผ, Y์ถ•์€ ์ƒ์„ฑ๋œ ๋‚œ์ˆ˜์˜ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด์ง€. ๋ณด์ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ๊ฐ’๋“ค์ด ๊ฝค๋‚˜ ๋ถˆ๊ทœ์น™์ ์œผ๋กœ ํŠ€๋Š” ๊ฒƒ ๊ฐ™์ง€? ์ด๊ฒŒ ๋ฐ”๋กœ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” '๋ฌด์ž‘์œ„' ๊ฐ™์€ ๋Š๋‚Œ์ด์•ผ!

ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์ ์€, ์ด ํŒจํ„ด์ด ๊ฒฐ๊ตญ์€ ๋ฐ˜๋ณต๋œ๋‹ค๋Š” ๊ฑฐ์•ผ. ์šฐ๋ฆฌ์˜ ๋ชจ๋“ˆ๋Ÿฌ m์ด 2^31 - 1์ด๋‹ˆ๊นŒ, ์ตœ๋Œ€ ์ด๋งŒํผ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ์ˆซ์ž๋ฅผ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ์–ด. ๊ทธ ๋‹ค์Œ๋ถ€ํ„ฐ๋Š” ๋‹ค์‹œ ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์ˆซ์ž๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋˜์ง€. ์ด๊ฑธ '์ฃผ๊ธฐ'๋ผ๊ณ  ๋ถˆ๋Ÿฌ.

โš ๏ธ ์ฃผ์˜ํ•  ์ : ์ด๋Ÿฐ ํŠน์„ฑ ๋•Œ๋ฌธ์—, ์„ ํ˜• ํ•ฉ๋™ ์ƒ์„ฑ๊ธฐ๋Š” ์•”ํ˜ธํ•™์ ์œผ๋กœ ์•ˆ์ „ํ•˜์ง€ ์•Š์•„. ์ถฉ๋ถ„ํ•œ ์ถœ๋ ฅ๊ฐ’์„ ๊ด€์ฐฐํ•˜๋ฉด ๋‹ค์Œ์— ๋‚˜์˜ฌ ๊ฐ’์„ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ๊ฑฐ๋“ . ๊ทธ๋ž˜์„œ ๋ณด์•ˆ์ด ์ค‘์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ๋‹ค๋ฅธ ๋ฐฉ์‹์˜ ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ด.

๐Ÿงช ์„ ํ˜• ํ•ฉ๋™ ์ƒ์„ฑ๊ธฐ์˜ ํ’ˆ์งˆ ํ‰๊ฐ€

์ž, ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ๊ฐ€ ์–ผ๋งˆ๋‚˜ '์ข‹์€์ง€' ํ‰๊ฐ€ํ•ด๋ณผ ์ฐจ๋ก€์•ผ. ๋‚œ์ˆ˜์˜ ํ’ˆ์งˆ์„ ํ‰๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์–ด. ๊ทธ ์ค‘ ๋ช‡ ๊ฐ€์ง€๋ฅผ ์‚ดํŽด๋ณด์ž!

1. ๊ท ๋“ฑ ๋ถ„ํฌ ํ…Œ์ŠคํŠธ

์ข‹์€ ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ๋ผ๋ฉด ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ๊ฐ’์ด ๊ฑฐ์˜ ๋™์ผํ•œ ๋นˆ๋„๋กœ ๋‚˜์™€์•ผ ํ•ด. ์ด๊ฑธ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ํžˆ์Šคํ† ๊ทธ๋žจ์„ ๊ทธ๋ ค๋ณผ ์ˆ˜ ์žˆ์–ด.

๋‚œ์ˆ˜ ๋ถ„ํฌ ํžˆ์Šคํ† ๊ทธ๋žจ ๋‚œ์ˆ˜ ๋ฒ”์œ„ ๋นˆ๋„

์ด ํžˆ์Šคํ† ๊ทธ๋žจ์„ ๋ณด๋ฉด, ๊ฐ ๋ฒ”์œ„์˜ ๋‚œ์ˆ˜๊ฐ€ ๋Œ€์ฒด๋กœ ๋น„์Šทํ•œ ๋นˆ๋„๋กœ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์–ด. ์™„๋ฒฝํ•˜๊ฒŒ ๊ท ๋“ฑํ•˜์ง€๋Š” ์•Š์ง€๋งŒ, ๊ฝค ๊ดœ์ฐฎ์€ ๋ถ„ํฌ๋ฅผ ๋ณด์ด๊ณ  ์žˆ์ง€?

2. ์ƒ๊ด€๊ด€๊ณ„ ํ…Œ์ŠคํŠธ

์—ฐ์†ํ•ด์„œ ์ƒ์„ฑ๋œ ๋‚œ์ˆ˜๋“ค ์‚ฌ์ด์— ์–ด๋–ค ๊ด€๊ณ„๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•ด. ์ด๋ฅผ ์œ„ํ•ด ์‚ฐ์ ๋„(scatter plot)๋ฅผ ๊ทธ๋ ค๋ณผ ์ˆ˜ ์žˆ์–ด.

๋‚œ์ˆ˜ ์ƒ๊ด€๊ด€๊ณ„ ์‚ฐ์ ๋„ n๋ฒˆ์งธ ๋‚œ์ˆ˜ n+1๋ฒˆ์งธ ๋‚œ์ˆ˜

์ด ์‚ฐ์ ๋„์—์„œ ์ ๋“ค์ด ํŠน์ • ํŒจํ„ด ์—†์ด ๊ณ ๋ฅด๊ฒŒ ํผ์ ธ ์žˆ๋‹ค๋ฉด, ๊ทธ๊ฑด ์ข‹์€ ์‹ ํ˜ธ์•ผ. ๋งŒ์•ฝ ์–ด๋–ค ๋šœ๋ ทํ•œ ํŒจํ„ด์ด ๋ณด์ธ๋‹ค๋ฉด, ๊ทธ๊ฑด ๋‚œ์ˆ˜๋“ค ์‚ฌ์ด์— ์ƒ๊ด€๊ด€๊ณ„๊ฐ€ ์žˆ๋‹ค๋Š” ๋œป์ด๊ณ , ์ด๋Š” ์ข‹์ง€ ์•Š์•„.

3. ์ฃผ๊ธฐ ๋ถ„์„

์„ ํ˜• ํ•ฉ๋™ ์ƒ์„ฑ๊ธฐ์˜ ์ฃผ๊ธฐ๋Š” ์ตœ๋Œ€ m-1์ด ๋  ์ˆ˜ ์žˆ์–ด. ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์ด๋ณด๋‹ค ์งง์€ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์ง€. ์ฃผ๊ธฐ๊ฐ€ ๊ธธ์ˆ˜๋ก ๋” ์ข‹์€ ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์–ด.

๐Ÿ” ๋” ๊นŠ์ด ๋“ค์–ด๊ฐ€๊ธฐ: ์„ ํ˜• ํ•ฉ๋™ ์ƒ์„ฑ๊ธฐ์˜ ์ฃผ๊ธฐ๋ฅผ ์ตœ๋Œ€ํ™”ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ํ•ด:

  • c์™€ m์€ ์„œ๋กœ์†Œ์—ฌ์•ผ ํ•ด.
  • a-1์€ m์˜ ๋ชจ๋“  ์†Œ์ธ์ˆ˜๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ ธ์•ผ ํ•ด.
  • ๋งŒ์•ฝ m์ด 4์˜ ๋ฐฐ์ˆ˜๋ผ๋ฉด, a-1๋„ 4์˜ ๋ฐฐ์ˆ˜์—ฌ์•ผ ํ•ด.

์ด๋Ÿฐ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” a, c, m ๊ฐ’์„ ์ฐพ๋Š” ๊ฒƒ์ด ์ข‹์€ ์„ ํ˜• ํ•ฉ๋™ ์ƒ์„ฑ๊ธฐ๋ฅผ ๋งŒ๋“œ๋Š” ํ•ต์‹ฌ์ด์•ผ!

๐Ÿš€ ์„ ํ˜• ํ•ฉ๋™ ์ƒ์„ฑ๊ธฐ์˜ ์‘์šฉ

์ž, ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ์ด ๋ฉ‹์ง„ ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ๋ฅผ ์–ด๋””์— ์“ธ ์ˆ˜ ์žˆ์„์ง€ ์ƒ๊ฐํ•ด๋ณด์ž. ์‚ฌ์‹ค ๋‚œ์ˆ˜๋Š” ์šฐ๋ฆฌ ์ผ์ƒ ๊ณณ๊ณณ์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์–ด. ๋ช‡ ๊ฐ€์ง€ ์žฌ๋ฏธ์žˆ๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊ฒŒ!

1. ๊ฐ„๋‹จํ•œ ์ฃผ์‚ฌ์œ„ ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ

๊ฐ€์žฅ ์‰ฝ๊ฒŒ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑด ์ฃผ์‚ฌ์œ„ ๊ฒŒ์ž„์ด์•ผ. ์šฐ๋ฆฌ์˜ ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ๋ฅผ ์ด์šฉํ•ด์„œ 1๋ถ€ํ„ฐ 6๊นŒ์ง€์˜ ์ˆซ์ž๋ฅผ ๋ฌด์ž‘์œ„๋กœ ๋ฝ‘์•„๋‚ด๋Š” ๊ฑฐ์ง€. ์—ฌ๊ธฐ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์ค€๋น„ํ–ˆ์–ด:


#include <stdio.h>
#include <stdint.h>
#include <time.h>

#define A 1103515245
#define C 12345
#define M 2147483648

uint32_t seed;

uint32_t rand() {
    seed = (A * seed + C) % M;
    return seed;
}

int roll_dice() {
    return (rand() % 6) + 1;
}

int main() {
    seed = time(NULL);  // ํ˜„์žฌ ์‹œ๊ฐ„์„ ์‹œ๋“œ๋กœ ์‚ฌ์šฉ
    
    printf("์ฃผ์‚ฌ์œ„๋ฅผ ๊ตด๋ฆฝ๋‹ˆ๋‹ค...\n");
    for (int i = 0; i < 5; i++) {
        printf("%d๋ฒˆ์งธ ๊ฒฐ๊ณผ: %d\n", i+1, roll_dice());
    }
    
    return 0;
}

์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, ๋งˆ์น˜ ์‹ค์ œ๋กœ ์ฃผ์‚ฌ์œ„๋ฅผ 5๋ฒˆ ๊ตด๋ฆฐ ๊ฒƒ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์–ด. ์žฌ๋ฏธ์žˆ์ง€ ์•Š์•„? ๐Ÿ˜„

2. ๊ฐ„๋‹จํ•œ ์•”ํ˜ธํ™”

๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ๋ฅผ ์ด์šฉํ•ด์„œ ์•„์ฃผ ๊ฐ„๋‹จํ•œ ํ˜•ํƒœ์˜ ์•”ํ˜ธํ™”๋ฅผ ํ•  ์ˆ˜๋„ ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ…์ŠคํŠธ์˜ ๊ฐ ๋ฌธ์ž๋ฅผ ๋‚œ์ˆ˜์™€ XOR ์—ฐ์‚ฐ์„ ํ•˜๋Š” ๊ฑฐ์•ผ. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์›๋ž˜ ํ…์ŠคํŠธ๋ฅผ ์•Œ์•„๋ณด๊ธฐ ํž˜๋“ค๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€.


#include <stdio.h>
#include <stdint.h>
#include <string.h>

// ... (์ด์ „์˜ rand() ํ•จ์ˆ˜๋Š” ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ)

void encrypt(char* text) {
    int len = strlen(text);
    for (int i = 0; i < len; i++) {
        text[i] = text[i] ^ (rand() & 0xFF);
    }
}

int main() {
    char message[] = "Hello, World!";
    printf("์›๋ณธ ๋ฉ”์‹œ์ง€: %s\n", message);
    
    encrypt(message);
    printf("์•”ํ˜ธํ™”๋œ ๋ฉ”์‹œ์ง€: %s\n", message);
    
    return 0;
}

๋ฌผ๋ก , ์ด ๋ฐฉ์‹์€ ๋งค์šฐ ๊ธฐ์ดˆ์ ์ธ ์•”ํ˜ธํ™” ๋ฐฉ๋ฒ•์ด๊ณ  ์‹ค์ œ๋กœ ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ๋ฐ๋Š” ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ ๋ผ. ํ•˜์ง€๋งŒ ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ์˜ ํ™œ์šฉ ๊ฐ€๋Šฅ์„ฑ์„ ๋ณด์—ฌ์ฃผ๋Š” ์ข‹์€ ์˜ˆ์‹œ์ง€!

๐Ÿ’ก ์•„์ด๋””์–ด: ์ด๋Ÿฐ ๊ฐ„๋‹จํ•œ ์•”ํ˜ธํ™” ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค์–ด์„œ ์žฌ๋Šฅ๋„ท์— ์˜ฌ๋ ค๋ณด๋Š” ๊ฑด ์–ด๋•Œ? ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค๊ณผ ํ•จ๊ป˜ ๋” ์•ˆ์ „ํ•˜๊ณ  ํšจ์œจ์ ์ธ ์•”ํ˜ธํ™” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ํ† ๋ก ํ•ด๋ณผ ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ.

3. ์‹œ๋ฎฌ๋ ˆ์ด์…˜

๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ๋Š” ๋‹ค์–‘ํ•œ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์—์„œ ์•„์ฃผ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ด. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ„๋‹จํ•œ ๋ชฌํ…Œ์นด๋ฅผ๋กœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ํ†ตํ•ด ์›์ฃผ์œจ(ฯ€)์„ ์ถ”์ •ํ•ด๋ณผ ์ˆ˜ ์žˆ์–ด. ์ด๊ฒŒ ์–ด๋–ป๊ฒŒ ๊ฐ€๋Šฅํ•œ์ง€ ํ•œ๋ฒˆ ๋ณผ๊นŒ?


#include <stdio.h>
#include <stdint.h>
#include <math.h>

// ... (์ด์ „์˜ rand() ํ•จ์ˆ˜๋Š” ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ)

double random_double() {
    return (double)rand() / M;
}

int main() {
    int inside_circle = 0;
    int total_points = 1000000;
    
    for (int i = 0; i < total_points; i++) {
        double x = random_double();
        double y = random_double();
        
        if (x*x + y*y <= 1.0) {
            inside_circle++;
        }
    }
    
    double pi_estimate = 4.0 * inside_circle / total_points;
    printf("์ถ”์ •๋œ ฯ€ ๊ฐ’: %f\n", pi_estimate);
    printf("์‹ค์ œ ฯ€ ๊ฐ’: %f\n", M_PI);
    
    return 0;
}

์ด ํ”„๋กœ๊ทธ๋žจ์€ ๋‹จ์œ„ ์ •์‚ฌ๊ฐํ˜• ์•ˆ์— ๊ทธ๋ ค์ง„ 1/4 ์›์— ๋ฌด์ž‘์œ„๋กœ ์ ์„ ์ฐ์–ด์„œ ์›์ฃผ์œจ์„ ์ถ”์ •ํ•ด. ์ ์ด ์› ์•ˆ์— ๋“ค์–ด๊ฐˆ ํ™•๋ฅ ์ด ฯ€/4์™€ ๊ฐ™๋‹ค๋Š” ์›๋ฆฌ๋ฅผ ์ด์šฉํ•œ ๊ฑฐ์ง€. ์‹ ๊ธฐํ•˜์ง€ ์•Š์•„? ๐Ÿค“

๋ชฌํ…Œ์นด๋ฅผ๋กœ ๋ฐฉ๋ฒ•์œผ๋กœ ฯ€ ์ถ”์ •ํ•˜๊ธฐ ๋ชฌํ…Œ์นด๋ฅผ๋กœ ฯ€ ์ถ”์ •

์ด ๊ทธ๋ฆผ์—์„œ ํŒŒ๋ž€ ์ ์€ 1/4 ์› ์•ˆ์— ๋“ค์–ด๊ฐ„ ์ ๋“ค์ด๊ณ , ๋นจ๊ฐ„ ์ ์€ ๋ฐ–์— ์žˆ๋Š” ์ ๋“ค์ด์•ผ. ํŒŒ๋ž€ ์ ์˜ ๋น„์œจ์— 4๋ฅผ ๊ณฑํ•˜๋ฉด ฯ€์˜ ๊ทผ์‚ฌ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ์ง€!

๐Ÿ”ฎ ์„ ํ˜• ํ•ฉ๋™ ์ƒ์„ฑ๊ธฐ์˜ ํ•œ๊ณ„์™€ ๋Œ€์•ˆ

์ง€๊ธˆ๊นŒ์ง€ ์„ ํ˜• ํ•ฉ๋™ ์ƒ์„ฑ๊ธฐ์— ๋Œ€ํ•ด ๋งŽ์ด ๋ฐฐ์› ์ง€? ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์—๋„ ํ•œ๊ณ„๊ฐ€ ์žˆ์–ด. ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ ์„ ์งš์–ด๋ณผ๊ฒŒ: