Namespaces
Variants

Pseudo-random number generation

From cppreference.net
< cpp โ€Ž | numeric

๋‚œ์ˆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ฌด์ž‘์œ„ ๋ฐ ์˜์‚ฌ ๋ฌด์ž‘์œ„ ์ˆซ์ž๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํด๋ž˜์Šค์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค:

  • ๊ท ์ผ ๋‚œ์ˆ˜ ๋น„ํŠธ ์ƒ์„ฑ๊ธฐ(URBG)๋Š” ๊ท ์ผ ๋ถ„ํฌ๋ฅผ ๊ฐ€์ง„ ์ •์ˆ˜ ์‹œํ€€์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์˜์‚ฌ ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ์ธ ๋‚œ์ˆ˜ ์—”์ง„๊ณผ (์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ) ์ง„๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ๋ฅผ ๋ชจ๋‘ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  • ๋‚œ์ˆ˜ ๋ถ„ํฌ (์˜ˆ: uniform , normal , ๋˜๋Š” poisson distributions )๋Š” URBG์˜ ์ถœ๋ ฅ์„ ๋‹ค์–‘ํ•œ ํ†ต๊ณ„์  ๋ถ„ํฌ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

URBG์™€ ๋ถ„ํฌ๋Š” ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜์–ด ๋‚œ์ˆ˜ ๊ฐ’์„ ์ƒ์„ฑํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋‚œ์ˆ˜ ์—”์ง„์€ ํŠน์ • ์‹œ๋“œ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜๊ณ , ์ง๋ ฌํ™” ๋ฐ ์—ญ์ง๋ ฌํ™”๋˜์–ด ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชฉ์ฐจ

๊ท ์ผ ๋ฌด์ž‘์œ„ ๋น„ํŠธ ์ƒ์„ฑ๊ธฐ

๊ท ์ผ ๋‚œ์ˆ˜ ๋น„ํŠธ ์ƒ์„ฑ๊ธฐ ๋Š” ๊ฐ€๋Šฅํ•œ ๊ฒฐ๊ณผ ๋ฒ”์œ„ ๋‚ด์˜ ๊ฐ ๊ฐ’์ด (์ด์ƒ์ ์œผ๋กœ) ๋™์ผํ•œ ํ™•๋ฅ ๋กœ ๋ฐ˜ํ™˜๋˜๋Š” ๋ถ€ํ˜ธ ์—†๋Š” ์ •์ˆ˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ท ์ผ ๋‚œ์ˆ˜ ๋น„ํŠธ ์ƒ์„ฑ๊ธฐ๋Š” UniformRandomBitGenerator ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค. C++20์€ ๋˜ํ•œ uniform_random_bit_generator ๊ฐœ๋…์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

ํ—ค๋” ํŒŒ์ผ์— ์ •์˜๋จ <random>
ํƒ€์ž…์ด ๊ท ์ผ ๋‚œ์ˆ˜ ๋น„ํŠธ ์ƒ์„ฑ์ž๋กœ ์ ํ•ฉํ•จ์„ ๋ช…์‹œ
(concept)

๋‚œ์ˆ˜ ์—”์ง„

๋žœ๋ค ๋„˜๋ฒ„ ์—”์ง„ (์ผ๋ฐ˜์ ์œผ๋กœ ์—”์ง„ ์œผ๋กœ ์ค„์—ฌ์”€)์€ ์‹œ๋“œ ๋ฐ์ดํ„ฐ๋ฅผ ์—”ํŠธ๋กœํ”ผ ์†Œ์Šค๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์˜์‚ฌ ๋‚œ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ท ์ผ ๋‚œ์ˆ˜ ๋น„ํŠธ ์ƒ์„ฑ๊ธฐ์ž…๋‹ˆ๋‹ค.

์–ธ์ œ๋“ ์ง€, ํƒ€์ž… E ์˜ ์—”์ง„ e ๋Š” ์Œ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ •์ˆ˜ i ์— ๋Œ€ํ•œ ์ƒํƒœ e i ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์ƒ์„ฑ ์‹œ, e ๋Š” ์—”์ง„ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์ดˆ๊ธฐ ์‹œ๋“œ(๋˜๋Š” ์‹œ๋“œ ์‹œํ€€์Šค)์— ์˜ํ•ด ๊ฒฐ์ •๋˜๋Š” ์ดˆ๊ธฐ ์ƒํƒœ e 0 ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

๋‹ค์Œ ์†์„ฑ๋“ค์€ ๋ชจ๋“  ์—”์ง„ ์œ ํ˜• E ์— ๋Œ€ํ•ด ํ•ญ์ƒ ์ •์˜๋ฉ๋‹ˆ๋‹ค:

  • E ์˜ ์ƒํƒœ ํฌ๊ธฐ๋ฅผ E::result_type ์˜ ํฌ๊ธฐ ๋ฐฐ์ˆ˜๋กœ ๋‚˜ํƒ€๋‚ธ ๊ฐ’(์ฆ‰, ( sizeof e i ) / sizeof ( E :: result_type ) ).
  • e ์˜ ์ƒํƒœ e i ๋ฅผ ํ›„์† ์ƒํƒœ e i+1 ๋กœ ์ „์ด์‹œํ‚ค๋Š” ์ „์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜ TA (์ฆ‰, TA ( e i ) == e i+1 ).
  • e ์˜ ์ƒํƒœ๋ฅผ E::result_type ํƒ€์ž…์˜ ๊ฐ’์œผ๋กœ ๋งคํ•‘ํ•˜๋Š” ์ƒ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜ GA , ๊ทธ ๊ฒฐ๊ณผ๋Š” ์˜์‚ฌ ๋‚œ์ˆ˜์ž…๋‹ˆ๋‹ค.

์˜์‚ฌ ๋‚œ์ˆ˜ ์‹œํ€€์Šค๋Š” TA ์™€ GA ๋ฅผ ๋ฒˆ๊ฐˆ์•„ ํ˜ธ์ถœํ•˜์—ฌ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์„ธ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ์˜์‚ฌ ๋‚œ์ˆ˜ ์ƒ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„์„ ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์ œ๊ณตํ•˜๋ฏ€๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์—”์ง„์„ ์‚ฌ์šฉํ• ์ง€ ์„ ํƒํ•˜๋Š” ๊ฒƒ์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ ˆ์ถฉ์ ์„ ์ˆ˜๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค:

  • ์„ ํ˜• ํ•ฉ๋™ ์—”์ง„ ์€ ๋น„๊ต์  ๋น ๋ฅด๋ฉฐ ์ƒํƒœ ์ €์žฅ์„ ์œ„ํ•œ ์š”๊ตฌ ๊ณต๊ฐ„์ด ๋งค์šฐ ์ž‘์Šต๋‹ˆ๋‹ค.
  • ๋ฉ”๋ฅด์„ผ ํŠธ์œ„์Šคํ„ฐ ์—”์ง„ ์€ ๋” ๋А๋ฆฌ๊ณ  ์ƒํƒœ ์ €์žฅ ์š”๊ตฌ ์‚ฌํ•ญ์ด ๋” ํฌ์ง€๋งŒ, ์ ์ ˆํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๊ฐ€์žฅ ๊ธด ๋น„๋ฐ˜๋ณต ์‹œํ€€์Šค์™€ ๊ฐ€์žฅ ๋ฐ”๋žŒ์งํ•œ ์ŠคํŽ™ํŠธ๋Ÿผ ํŠน์„ฑ(๋ฐ”๋žŒ์งํ•จ์˜ ์ •์˜์— ๋”ฐ๋ผ)์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
  • ์บ๋ฆฌ ๊ฐ์‚ฐ ์—”์ง„ ์€ ๊ณ ๊ธ‰ ์‚ฐ์ˆ  ๋ช…๋ น์–ด ์„ธํŠธ๊ฐ€ ์—†๋Š” ํ”„๋กœ์„ธ์„œ์—์„œ๋„ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•˜์ง€๋งŒ, ๋” ํฐ ์ƒํƒœ ์ €์žฅ ๊ณต๊ฐ„๊ณผ ๋•Œ๋กœ๋Š” ๋œ ๋ฐ”๋žŒ์งํ•œ ์ŠคํŽ™ํŠธ๋Ÿผ ํŠน์„ฑ์„ ๊ฐ€์ง€๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • Philox ์—”์ง„ ์€ ์นด์šดํ„ฐ ๊ธฐ๋ฐ˜ ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ ์ž…๋‹ˆ๋‹ค. ์ž‘์€ ์ƒํƒœ ํฌ๊ธฐ์™€ ๊ธด ์ฃผ๊ธฐ(์ตœ์†Œ 2^130 ์ด์ƒ)๋ฅผ ๊ฐ€์ง€๋ฉฐ, ๋Œ€๊ทœ๋ชจ ๋ณ‘๋ ฌ ๋‚œ์ˆ˜ ์ƒ์„ฑ์ด ํ•„์š”ํ•œ ๋ชฌํ…Œ์นด๋ฅผ๋กœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์— ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‰ฝ๊ฒŒ ๋ฒกํ„ฐํ™” ๋ฐ ๋ณ‘๋ ฌํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ GPU ์ตœ์ ํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.
(C++26๋ถ€ํ„ฐ)

์ด๋“ค ๋‚œ์ˆ˜ ์—”์ง„ ์ค‘ ๊ทธ ์–ด๋А ๊ฒƒ๋„ ์•”ํ˜ธํ•™์ ์œผ๋กœ ์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ณด์•ˆ ์ž‘์—…๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ํ•ด๋‹น ๋ชฉ์ ์„ ์œ„ํ•ด์„œ๋Š” ์•”ํ˜ธํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค (์˜ˆ: OpenSSL RAND_bytes ).

์ด ํ…œํ”Œ๋ฆฟ๋“ค๋กœ๋ถ€ํ„ฐ ์ธ์Šคํ„ด์Šคํ™”๋œ ๋ชจ๋“  ํƒ€์ž…์€ RandomNumberEngine ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค.

ํ—ค๋” ํŒŒ์ผ์— ์ •์˜๋จ <random>
์„ ํ˜• ํ•ฉ๋™ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•จ
(ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ)
๋ฉ”๋ฅด์„ผ ํŠธ์œ„์Šคํ„ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•จ
(ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ)
์บ๋ฆฌ ๊ฐ์‚ฐ( ์ง€์—ฐ ํ”ผ๋ณด๋‚˜์น˜ ) ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•จ
(ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ)
์นด์šดํ„ฐ ๊ธฐ๋ฐ˜ ๋ณ‘๋ ฌํ™” ๊ฐ€๋Šฅ ์ƒ์„ฑ๊ธฐ
(ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ)

๋‚œ์ˆ˜ ์—”์ง„ ์–ด๋Œ‘ํ„ฐ

๋žœ๋ค ๋„˜๋ฒ„ ์—”์ง„ ์–ด๋Œ‘ํ„ฐ๋Š” ๋‹ค๋ฅธ ๋žœ๋ค ๋„˜๋ฒ„ ์—”์ง„์„ ์—”ํŠธ๋กœํ”ผ ์†Œ์Šค๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์˜์‚ฌ ๋‚œ์ˆ˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๊ธฐ๋ณธ ์—”์ง„์˜ ์ŠคํŽ™ํŠธ๋Ÿผ ํŠน์„ฑ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

ํ—ค๋” ํŒŒ์ผ์— ์ •์˜๋จ <random>
๋‚œ์ˆ˜ ์—”์ง„์˜ ์ผ๋ถ€ ์ถœ๋ ฅ์„ ๋ฒ„๋ฆผ
(ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ)
๋‚œ์ˆ˜ ์—”์ง„์˜ ์ถœ๋ ฅ์„ ์ง€์ •๋œ ๋น„ํŠธ ์ˆ˜์˜ ๋ธ”๋ก์œผ๋กœ ํŒจํ‚น
(ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ)
๋‚œ์ˆ˜ ์—”์ง„์˜ ์ถœ๋ ฅ์„ ๋‹ค๋ฅธ ์ˆœ์„œ๋กœ ์ „๋‹ฌ
(ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ)

๋ฏธ๋ฆฌ ์ •์˜๋œ ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ

์—ฌ๋Ÿฌ ๊ตฌ์ฒด์ ์ธ ์ธ๊ธฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋ฏธ๋ฆฌ ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ—ค๋”์— ์ •์˜๋จ <random>
์œ ํ˜• ์ •์˜
minstd_rand0 (C++11) std:: linear_congruential_engine < std:: uint_fast32_t ,
16807 , 0 , 2147483647 >

1969๋…„ Lewis, Goodman ๋ฐ Miller๊ฐ€ ๋ฐœ๊ฒฌํ•˜๊ณ , 1988๋…„ Park๊ณผ Miller์— ์˜ํ•ด "์ตœ์†Œ ํ‘œ์ค€"์œผ๋กœ ์ฑ„ํƒ๋จ

minstd_rand (C++11)

std:: linear_congruential_engine < std:: uint_fast32_t ,
48271 , 0 , 2147483647 >
1993๋…„ Park, Miller, Stockmeyer๊ฐ€ ๊ถŒ์žฅํ•œ ์ƒˆ๋กœ์šด "์ตœ์†Œ ํ‘œ์ค€"

mt19937 (C++11)

std:: mersenne_twister_engine < std:: uint_fast32_t ,
32 , 624 , 397 , 31 ,
0x9908b0df , 11 ,
0xffffffff , 7 ,
0x9d2c5680 , 15 ,
0xefc60000 , 18 , 1812433253 >
Matsumoto์™€ Nishimura์˜ 32๋น„ํŠธ ๋ฉ”๋ฅด์„ผ ํŠธ์œ„์Šคํ„ฐ, 1998

mt19937_64 (C++11)

std:: mersenne_twister_engine < std:: uint_fast64_t ,
64 , 312 , 156 , 31 ,
0xb5026f5aa96619e9 , 29 ,
0x5555555555555555 , 17 ,
0x71d67fffeda60000 , 37 ,
0xfff7eee000000000 , 43 ,
6364136223846793005 >
๋งˆ์ธ ๋ชจํ† ์™€ ๋‹ˆ์‹œ๋ฌด๋ผ์˜ 64๋น„ํŠธ ๋ฉ”๋ฅด์„ผ ํŠธ์œ„์Šคํ„ฐ, 2000

ranlux24_base (C++11) std:: subtract_with_carry_engine < std:: uint_fast32_t , 24 , 10 , 24 >
ranlux48_base (C++11) std:: subtract_with_carry_engine < std:: uint_fast64_t , 48 , 5 , 12 >
ranlux24 (C++11) std:: discard_block_engine < std:: ranlux24_base , 223 , 23 >

24๋น„ํŠธ RANLUX ์ƒ์„ฑ๊ธฐ (Martin Lรผscher์™€ Fred James, 1994)

ranlux48 (C++11) std:: discard_block_engine < std:: ranlux48_base , 389 , 11 >

48๋น„ํŠธ RANLUX ์ƒ์„ฑ๊ธฐ (Martin Lรผscher์™€ Fred James, 1994)

knuth_b (C++11) std:: shuffle_order_engine < std:: minstd_rand0 , 256 >
philox4x32 (C++26) std:: philox_engine < std:: uint_fast32_t , 32 , 4 , 10 ,
0xCD9E8D57 , 0x9E3779B9 ,
0xD2511F53 , 0xBB67AE85 >
philox4x64 (C++26) std:: philox_engine < std:: uint_fast64_t , 64 , 4 , 10 ,
0xCA5A826395121157 , 0x9E3779B97F4A7C15 ,
0xD2E7470EE14C6C93 , 0xBB67AE8584CAA73B >
default_random_engine (C++11) ๊ตฌํ˜„ ์ •์˜ RandomNumberEngine ํƒ€์ž…

๋น„๊ฒฐ์ •์  ๋‚œ์ˆ˜

std::random_device ๋Š” ๋น„๊ฒฐ์ •์  ๊ท ์ผ ๋‚œ์ˆ˜ ๋น„ํŠธ ์ƒ์„ฑ๊ธฐ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋น„๊ฒฐ์ •์  ๋‚œ์ˆ˜ ์ƒ์„ฑ์— ๋Œ€ํ•œ ์ง€์›์ด ์—†๋Š” ๊ฒฝ์šฐ ๊ตฌํ˜„์ฒด๊ฐ€ std::random_device ๋ฅผ ์˜์‚ฌ ๋‚œ์ˆ˜ ์—”์ง„์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

ํ•˜๋“œ์›จ์–ด ์—”ํŠธ๋กœํ”ผ ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋น„๊ฒฐ์ •์  ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ
(ํด๋ž˜์Šค)

๋‚œ์ˆ˜ ๋ถ„ํฌ

๋‚œ์ˆ˜ ๋ถ„ํฌ๋Š” URBG์˜ ์ถœ๋ ฅ์„ ์‚ฌํ›„ ์ฒ˜๋ฆฌํ•˜์—ฌ ๊ฒฐ๊ณผ ์ถœ๋ ฅ์ด ์ •์˜๋œ ํ†ต๊ณ„์  ํ™•๋ฅ  ๋ฐ€๋„ ํ•จ์ˆ˜์— ๋”ฐ๋ผ ๋ถ„ํฌ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๋‚œ์ˆ˜ ๋ถ„ํฌ๋Š” RandomNumberDistribution ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค.

ํ—ค๋”์— ์ •์˜๋จ <random>
๊ท ์ผ ๋ถ„ํฌ
๋ฒ”์œ„ ๋‚ด์—์„œ ๊ท ์ผํ•˜๊ฒŒ ๋ถ„ํฌ๋œ ์ •์ˆ˜ ๊ฐ’์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค
(ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ)
๋ฒ”์œ„ ๋‚ด์—์„œ ๊ท ์ผํ•˜๊ฒŒ ๋ถ„ํฌ๋œ ์‹ค์ˆ˜ ๊ฐ’์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค
(ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ)
๋ฒ ๋ฅด๋ˆ„์ด ๋ถ„ํฌ
bool ๊ฐ’์„ ๋ฒ ๋ฅด๋ˆ„์ด ๋ถ„ํฌ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค
(ํด๋ž˜์Šค)
์ดํ•ญ ๋ถ„ํฌ ์ƒ์˜ ์ •์ˆ˜ ๊ฐ’์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค
(ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ)
์Œ์ดํ•ญ ๋ถ„ํฌ๋ฅผ ๋”ฐ๋ฅด๋Š” ์ •์ˆ˜ ๊ฐ’์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค negative binomial distribution
(ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ)
๊ธฐํ•˜ ๋ถ„ํฌ ์ƒ์˜ ์ •์ˆ˜ ๊ฐ’์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค
(ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ)
ํฌ์•„์†ก ๋ถ„ํฌ
ํ‘ธ์•„์†ก ๋ถ„ํฌ ์ƒ์˜ ์ •์ˆ˜ ๊ฐ’์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค
(ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ)
์ง€์ˆ˜ ๋ถ„ํฌ ์ƒ์˜ ์‹ค์ˆ˜ ๊ฐ’์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค
(ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ)
๊ฐ๋งˆ ๋ถ„ํฌ ์ƒ์˜ ์‹ค์ˆ˜ ๊ฐ’์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค
(ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ)
Weibull distribution ์— ๋”ฐ๋ฅธ ์‹ค์ˆ˜ ๊ฐ’์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค
(ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ)
๊ทน๊ฐ’ ๋ถ„ํฌ ์ƒ์˜ ์‹ค์ˆ˜ ๊ฐ’์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค
(ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ)
์ •๊ทœ ๋ถ„ํฌ
ํ‘œ์ค€ ์ •๊ทœ (๊ฐ€์šฐ์‹œ์•ˆ) ๋ถ„ํฌ ์—์„œ ์‹ค์ˆ˜ ๊ฐ’์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค
(ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ)
๋กœ๊ทธ ์ •๊ทœ ๋ถ„ํฌ ์ƒ์˜ ์‹ค์ˆ˜ ๊ฐ’์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค
(ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ)
์นด์ด์ œ๊ณฑ ๋ถ„ํฌ ์ƒ์˜ ์‹ค์ˆ˜ ๊ฐ’์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค
(ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ)
์ฝ”์‹œ ๋ถ„ํฌ ์ƒ์˜ ์‹ค์ˆ˜ ๊ฐ’์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค
(ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ)
Fisher์˜ F-๋ถ„ํฌ ์ƒ์˜ ์‹ค์ˆ˜ ๊ฐ’์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค
(ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ)
์‹ค์ˆ˜ ๊ฐ’์„ ์ŠคํŠœ๋˜ํŠธ t-๋ถ„ํฌ ์— ๋”ฐ๋ผ ์ƒ์„ฑํ•จ
(ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ)
ํ‘œ๋ณธ ๋ถ„ํฌ
์ด์‚ฐ ๋ถ„ํฌ์—์„œ ์ •์ˆ˜ ๊ฐ’์„ ์ƒ์„ฑํ•จ
(ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ)
์ผ์ •ํ•œ ๋ถ€๋ถ„ ๊ตฌ๊ฐ„์— ๋ถ„ํฌ๋œ ์‹ค์ˆ˜ ๊ฐ’์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค
(ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ)
์ •์˜๋œ ๋ถ€๋ถ„ ๊ตฌ๊ฐ„์— ๋ถ„ํฌ๋œ ์‹ค์ˆ˜ ๊ฐ’์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค
(ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ)

์œ ํ‹ธ๋ฆฌํ‹ฐ

ํ—ค๋” ํŒŒ์ผ์— ์ •์˜๋จ <random>
์ฃผ์–ด์ง„ ์ •๋ฐ€๋„์˜ ์‹ค์ˆ˜ ๊ฐ’์„ [ โ€‹ 0 โ€‹ , 1 ) ๊ตฌ๊ฐ„์— ๊ท ์ผํ•˜๊ฒŒ ๋ถ„ํฌ์‹œํ‚ด
(ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ)
(C++11)
๋ฒ”์šฉ ํŽธํ–ฅ ์ œ๊ฑฐ ์Šคํฌ๋žจ๋ธ” ์‹œ๋“œ ์‹œํ€€์Šค ์ƒ์„ฑ๊ธฐ
(ํด๋ž˜์Šค)

๋‚œ์ˆ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜

ํ—ค๋” ํŒŒ์ผ์— ์ •์˜๋จ <random>
๋ฒ”์œ„๋ฅผ ๊ท ์ผ ๋‚œ์ˆ˜ ๋น„ํŠธ ์ƒ์„ฑ๊ธฐ๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ๋œ ๋‚œ์ˆ˜๋กœ ์ฑ„์›€
(์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ•จ์ˆ˜ ๊ฐ์ฒด)

C ๋žœ๋ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

์œ„์—์„œ ์„ค๋ช…ํ•œ ์—”์ง„๊ณผ ๋ถ„ํฌ ์™ธ์—๋„, C ๋žœ๋ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•จ์ˆ˜์™€ ์ƒ์ˆ˜๋“ค๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค:

ํ—ค๋” ํŒŒ์ผ์— ์ •์˜๋จ <cstdlib>
์˜์‚ฌ ๋‚œ์ˆ˜ ์ƒ์„ฑ
(ํ•จ์ˆ˜)
์˜์‚ฌ ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ ์‹œ๋“œ ์„ค์ •
(ํ•จ์ˆ˜)
std::rand ๊ฐ€ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ“๊ฐ’
(๋งคํฌ๋กœ ์ƒ์ˆ˜)

์˜ˆ์ œ

#include <cmath>
#include <iomanip>
#include <iostream>
#include <map>
#include <random>
#include <string>
int main()
{
    // ์‹ค์ œ ๋žœ๋ค ๊ฐ’์œผ๋กœ ์‹œ๋“œ ์„ค์ • (์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ)
    std::random_device r;
    // 1๊ณผ 6 ์‚ฌ์ด์˜ ๋žœ๋ค ํ‰๊ท ๊ฐ’ ์„ ํƒ
    std::default_random_engine e1(r());
    std::uniform_int_distribution<int> uniform_dist(1, 6);
    int mean = uniform_dist(e1);
    std::cout << "๋ฌด์ž‘์œ„๋กœ ์„ ํƒ๋œ ํ‰๊ท : " << mean << '\n';
    // ํ•ด๋‹น ํ‰๊ท ์„ ์ค‘์‹ฌ์œผ๋กœ ์ •๊ทœ ๋ถ„ํฌ ์ƒ์„ฑ
    std::seed_seq seed2{r(), r(), r(), r(), r(), r(), r(), r()};
    std::mt19937 e2(seed2);
    std::normal_distribution<> normal_dist(mean, 2);
    std::map<int, int> hist;
    for (int n = 0; n != 10000; ++n)
        ++hist[std::round(normal_dist(e2))];
    std::cout << "์ •๊ทœ ๋ถ„ํฌ (ํ‰๊ท  " << mean << "):\n"
              << std::fixed << std::setprecision(1);
    for (auto [x, y] : hist)
        std::cout << std::setw(2) << x << ' ' << std::string(y / 200, '*') << '\n';
}

๊ฐ€๋Šฅํ•œ ์ถœ๋ ฅ:

๋ฌด์ž‘์œ„๋กœ ์„ ํƒ๋œ ํ‰๊ท : 4
์ •๊ทœ ๋ถ„ํฌ (ํ‰๊ท  4):
-4
-3
-2
-1
 0 *
 1 ***
 2 ******
 3 ********
 4 *********
 5 ********
 6 ******
 7 ***
 8 *
 9
10
11
12

์ฐธ๊ณ  ํ•ญ๋ชฉ

C ๋ฌธ์„œ for ์˜์‚ฌ ๋‚œ์ˆ˜ ์ƒ์„ฑ