在現代 PHP 開發中,mt_rand() 應該是生成偽隨機數的首選。它基於 Mersenne Twister(梅森旋轉)演算法,速度比舊式 rand()(依賴 libc)快約 4 倍,隨機品質更高,且不受平台 RAND_MAX 限制。
| 特性 | rand() | mt_rand() |
|---|---|---|
| 底層演算法 | 系統 libc 隨機數產生器(線性同餘法等,視作業系統而定) | Mersenne Twister(MT19937),週期 2¹⁹⁹³⁷−1 |
| 執行速度 | 基準 | 約 4 倍快 |
| 隨機品質 | 低,存在明顯規律性,不適合密碼學用途 | 高,通過 Diehard 測試套件,統計特性優異 |
| 最大值限制 | Windows 下 RAND_MAX 僅 32767,需指定 min/max 才能突破 | 無平台限制,支援完整 32 位整數範圍 |
| 種子自動化 | PHP 4.2.0+ 自動播種(srand() 不再必要) | PHP 4.2.0+ 自動播種(mt_srand() 不再必要) |
// 無參數:返回 0 ~ RAND_MAX (rand) 或 0 ~ mt_getrandmax() (mt_rand)
$n1 = rand();
$n2 = mt_rand();
// 指定範圍:包含 min 與 max
$n3 = rand(5, 15); // 5~15
$n4 = mt_rand(5, 15); // 5~15,推薦寫法
<?php
$iterations = 1_000_000;
// rand()
$start = microtime(true);
for ($i = 0; $i < $iterations; $i++) {
rand(1, 1000);
}
$randTime = microtime(true) - $start;
// mt_rand()
$start = microtime(true);
for ($i = 0; $i < $iterations; $i++) {
mt_rand(1, 1000);
}
$mtRandTime = microtime(true) - $start;
echo "rand() 耗時: {$randTime:.4f} 秒\n";
echo "mt_rand() 耗時: {$mtRandTime:.4f} 秒\n";
echo "mt_rand() 快 " . round($randTime / $mtRandTime, 1) . " 倍\n";
典型輸出:
rand() 耗時: 0.1842 秒
mt_rand() 耗時: 0.0451 秒
mt_rand() 快 4.1 倍
PHP 4.2.0 起已自動以高熵值種子初始化,**手動播種反而會降低隨機性**(若種子來源單一)。
兩者皆為偽隨機數產生器(PRNG),**不可用於金鑰生成、Token、密碼重設連結**等安全敏感場景。請改用:
random_int()、random_bytes()openssl_random_pseudo_bytes() 或 mcrypt_create_iv()mt_rand(1000, 9999)shuffle($arr) 內部即使用 mt_randmt_rand(1, 100) <= $ratemt_rand() . mt_rand() 組合rand() 內部已改用 MT 演算法,成為 mt_rand() 別名,但為了代碼可讀性與向後相容,**仍建議顯式使用 mt_rand()**。rand()、srand()、getrandmax() 棄用,未來版本將移除。除非維護極舊代碼(PHP < 4.2),**所有新專案請直接使用 mt_rand()**。它更快、更強、無平台差異,是 PHP 偽隨機數的「黃金標準」。