在 Web 開發中常需要生成隨機顏色,如:標籤雲顏色、圖表配色、驗證碼干擾線、動態主題色等。本文介紹三種 PHP 生成隨機十六進位顏色值的方法,並分析其優缺點。
function random_color() {
mt_srand((double)microtime() * 1000000); // 種子初始化(PHP 4.2+ 可省略)
$c = '';
while (strlen($c) < 6) {
$c .= sprintf("%02X", mt_rand(0, 255));
}
return $c;
}
特點:使用 Mersenne Twister 隨機演算法,速度快、隨機度高;`sprintf("%02X")` 確保兩位大寫十六進位,不足補零。
function randrgb() {
$str = '0123456789ABCDEF';
$estr = '#';
$len = strlen($str);
for ($i = 1; $i <= 6; $i++) {
$num = rand(0, $len - 1);
$estr .= $str[$num];
}
return $estr;
}
特點:直觀易懂,直接從合法字元池抽取;回傳值包含 `#` 前綴,可直接用於 CSS。
function randColor() {
$colors = array();
for ($i = 0; $i < 6; $i++) {
$colors[] = dechex(rand(0, 15));
}
return implode('', $colors);
}
特點:利用 `dechex(0-15)` 直接生成單個十六進位字元,代碼簡潔;不含 `#` 前綴,使用時需自行補充。
<?php
echo '隨機顏色:#' . randColor() . '';
?>
| 方法 | 執行速度 | 隨機度 | 代碼複雜度 | 回傳格式 |
|---|---|---|---|---|
| mt_rand + sprintf | 最快 | 高(Mersenne Twister) | 中等 | 純色值 (如 FF00AA) |
| 字元池抽取 | 中等 | 中等 | 簡單 | 含 # 前綴 (#FF00AA) |
| dechex 轉換 | 中等 | 中等 | 最簡潔 | 純色值 |
單純隨機可能產生相近顏色,若需視覺上明顯區分:
function randomDistinctColor($existing = array()) {
do {
$color = random_color();
$tooSimilar = false;
foreach ($existing as $ex) {
// 簡單的色差檢測
$diff = abs(hexdec(substr($color,0,2)) - hexdec(substr($ex,0,2)))
+ abs(hexdec(substr($color,2,2)) - hexdec(substr($ex,2,2)))
+ abs(hexdec(substr($color,4,2)) - hexdec(substr($ex,4,2)));
if ($diff < 200) { $tooSimilar = true; break; }
}
} while ($tooSimilar);
return $color;
}
三種方法各有優勢,根據專案具體需求選擇即可。