๋ฐ˜์‘ํ˜•

HEX ์ƒ‰์ƒ ์ฝ”๋“œ๋Š” RGB ์ƒ‰์ƒ์„ RRGGBB ํ˜•์‹์˜ 16์ง„์ˆ˜๋กœ ํ‘œํ˜„ํ•œ๋‹ค. HEX ์ฝ”๋“œ์˜ ์ตœ์†Œ ๊ฐ’์€ #000000(๊ฒ€์€์ƒ‰, 10์ง„์ˆ˜ 0), ์ตœ๋Œ“๊ฐ’์€ #FFFFFF(ํฐ์ƒ‰, 10์ง„์ˆ˜ 16777215)์ด๊ธฐ ๋•Œ๋ฌธ์— 0~16777215 ์‚ฌ์ด์˜ ๋žœ๋ค ์ˆซ์ž๋ฅผ 16์ง„์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  #๋ฅผ ๋ถ™์ด๋ฉด ๋žœ๋คํ•œ HEX ์ƒ‰์ƒ ์ฝ”๋“œ๊ฐ€ ๋œ๋‹ค.

export const getRandomColor = ({
  transparent = false,
  transProbability = 0.2,
} = {}) => {
  // transProbability ํ™•๋ฅ ๋กœ(๊ธฐ๋ณธ๊ฐ’ 20%) ํˆฌ๋ช…๊ฐ’ ๋ฐ˜ํ™˜
  if (transparent && Math.random() < transProbability) return "transparent";

  // 16์ง„์ˆ˜๋กœ 0xFFFFFF (RGB์˜ ์ตœ๋Œ“๊ฐ’)
  const MAX_COLOR_VALUE = 16777215;
  // ํฐ์ƒ‰๋„ ํฌํ•จํ•˜๊ธฐ ์œ„ํ•ด + 1
  const randomColor = Math.floor(Math.random() * (MAX_COLOR_VALUE + 1));
  return `#${randomColor.toString(16).padStart(6, "0")}`;
};

 

Math.random() ๋ฉ”์„œ๋“œ๋Š” 0 ์ด์ƒ 1 ๋ฏธ๋งŒ(0 ≤ x < 1)์˜ ๋‚œ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ์ด ๋‚œ์ˆ˜๋“ค์€ ๊ฑฐ์˜ ๊ท ๋“ฑํ•˜๊ฒŒ ๋ถ„ํฌ๋˜๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ๋‹ค(approximately uniform distribution). ์ฆ‰, 0๊ณผ 1 ์‚ฌ์ด์˜ ๋ชจ๋“  ์ˆซ์ž๊ฐ€ ๊ฑฐ์˜ ๋™์ผํ•œ ํ™•๋ฅ ๋กœ ์„ ํƒ๋œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

๋”ฐ๋ผ์„œ ์กฐ๊ฑด์‹ Math.random() < n์€ 0 ≤ x < 1 ๋‚œ์ˆ˜ ๊ฐ’์ด n๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ์˜ ํ™•๋ฅ ์„ ์˜๋ฏธํ•˜๋ฉฐ, n์„ ํ™•๋ฅ ๋กœ ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด n = 0.2 ์ผ ๋•Œ Math.random()์ด 0.2๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ํ™•๋ฅ ์€ 20%์ด๋‹ค.

 

RGB๋Š” Red(R), Green(G), Blue(B) 3๊ฐ€์ง€ ์ƒ‰์ƒ ์ฑ„๋„๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ ๊ฐ ์ฑ„๋„์€ 8๋น„ํŠธ๋กœ ํ‘œํ˜„๋œ๋‹ค. 8๋น„ํŠธ๋Š” 2^8=256๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค(0-255). RGB๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์ด ์ƒ‰์ƒ ์ˆ˜๋Š” 256^3=16777216 ์ด์ง€๋งŒ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ 0-16777215 ๋ฒ”์œ„๋ฅผ ๊ฐ€์ง„๋‹ค.

 

  • (16) #000000 = (10) 0 = RGB(0, 0, 0)
  • (16) #FFFFFF = (10) 16777215 = RGB(255, 255, 255)
 

 


๊ธ€ ์ˆ˜์ •์‚ฌํ•ญ์€ ๋…ธ์…˜ ํŽ˜์ด์ง€์— ๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”
๋ฐ˜์‘ํ˜•