ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

如何生成好看的随机颜色?深度剖析TinyColor的random算法原理

2026/8/27 15:25:10 拓冰建站 浏览量
如何生成好看的随机颜色?深度剖析TinyColor的random算法原理 如何生成好看的随机颜色深度剖析TinyColor的random算法原理【免费下载链接】tinycolor Color manipulation and conversion项目地址: https://gitcode.com/gh_mirrors/tin/tinycolorTinyColor 是一款轻量级 JavaScript 颜色处理库其中的random()函数可以一句话生成看起来就好看的随机颜色。它不是简单地把 RGB 三个通道各掷一次骰子而是基于色相环分区 亮度下限曲线的分步随机策略。本文将带你拆解 TinyColor 的 random 算法原理掌握生成随机颜色的正确姿势。为什么 Math.random() 随机出来的颜色总是丑最直观的随机颜色写法是分别对红、绿、蓝三通道取值Math.random()。但 RGB 空间中好看的颜色占比极低低饱和度的脏灰、高饱和度的刺眼荧光色都会等概率出现丑色概率接近五成。问题在于人眼对好看的判断是结构化的——色相红橙黄绿青蓝紫哪个区间、饱和度鲜艳还是柔和、明度亮还是暗各自有合理范围而且三者互相制约。比如黄色在明度很低时会变成浑浊的橄榄色。TinyColor 的random()正是把好看拆解成了三步可控的决策核心实现在 src/random.tsrandom(); // 返回一个吸引眼球的随机颜色 TinyColor第一步先掷色相——在色相环上划好合法区间算法入口在random()主函数中顺序是先选色相 H再用 H 决定饱和度 S最后用 H 和 S 决定明度 B色相选择pickHue()饱和度选择pickSaturation()明度选择pickBrightness()色相不是 0~360 平均分布而是按颜色名字划分成区间。例如红色是 334°~18°跨越 0° 位置橙色是 19°~46°绿色是 63°~178°。这些区间定义在bounds常量里。一个精巧的细节红色横跨 0° 导致区间被劈成两半代码用负数把 334°~360° 映射成 -26°~0°让红色变成一个连续的[-26, 18]区间最后再还原回 360° 之后——这是随机工具中少见的边界处理巧思。第二步根据色相决定饱和度范围每种颜色都有自己的健康饱和度窗口。例如黄色饱和度超过一定值就会变成刺眼的荧光因此黄色区间内的饱和度上限被压得更低。luminosity亮度倾向参数会在这个窗口上二次裁剪选项效果bright饱和度下限抬到 55生成鲜艳色light饱和度上限压到 55生成柔和粉彩色dark饱和度区间收窄到高位附近生成深邃暗色random不做限制0~100 全范围真随机另外hue: monochrome会直接返回饱和度为 0 的灰阶色。第三步用亮度下限曲线兜底这是整个算法里最值钱的部分。getMinimumBrightness(H, S)函数为每种颜色维护了一组折线点lowerBounds描述了**该色相在给定饱和度下明度至少要多高才算好看**。以红色为例其下限曲线是饱和度 20 时明度可以低到 100……不是 20 对应 100 起步、100 时只需 50 即可——也就是说红色越饱和允许越暗深红很好看而低饱和红色则必须足够亮否则就是脏粉。函数在折线点之间做线性插值算出当前 (H, S) 组合的明度地板再在这个地板之上随机取值dark明度只在地板以上 20 个单位内取值light明度下限抬升到区间中点random地板取消0~100 全范围随机三步走完得到一个 HSVA 对象并包装成 TinyColor 实例随后可用toHexString()等方法输出十六进制颜色值。一次生成多个颜色count 参数传count会返回一个颜色数组。内部有个细节循环生成时会每次给 seed 自增 1否则同一份配置会永远生成同一个颜色。import { random } from ctrl/tinycolor; random({ count: 10, hue: green }); // 10 个绿色 random({ hue: blue, luminosity: light }); // 浅蓝色这些行为都有单元测试锁定见 test/random.spec.ts。种子seed可复现的伪随机日常Math.random()无法复现结果而random()支持传入整数seed。此时随机数由一个经典的线性同余公式驱动seed (seed * 9301 49297) % 233280同一个 seed 永远产出完全相同的颜色序列——这对 UI 主题生成、图表配色、Bug 复现场景非常实用把 seed 存进配置用户每次刷新看到的都是同一套随机配色。random({ seed: 420420 }); // 每次调用结果一致总结random 算法的核心思想思想对应实现好看 结构约束而非全空间随机色相按颜色名字分区参数之间互相制约饱和度范围取决于色相给丑兜底亮度下限曲线线性插值可复现线性同余种子随机数这套算法源自 CC0 协议的 randomColor 项目David Merfield 出品TinyColor 在其之上统一了输入解析与输出格式让随机颜色也能享受 TinyColor 完整的颜色转换能力。理解了它你就拥有了一个通用的审美参数化模板把主观的好看翻译成一组区间和曲线再在约束内随机——这在配色工具、主题生成器里都同样适用。【免费下载链接】tinycolor Color manipulation and conversion项目地址: https://gitcode.com/gh_mirrors/tin/tinycolor创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考