πŸͺ„ Programming

[JS] μžλ°”μŠ€ν¬λ¦½νŠΈ 랜덀 색상(Random Color) μƒμ„±ν•˜κΈ°

ColorFilter 2025. 3. 4. 00:29
λ°˜μ‘ν˜•

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)

 


κΈ€ μˆ˜μ •μ‚¬ν•­μ€ λ…Έμ…˜ νŽ˜μ΄μ§€μ— κ°€μž₯ λΉ λ₯΄κ²Œ λ°˜μ˜λ©λ‹ˆλ‹€. 링크λ₯Ό μ°Έκ³ ν•΄ μ£Όμ„Έμš”
λ°˜μ‘ν˜•