2024 年 PHP Conference Japan

mt_rand

(PHP 4, PHP 5, PHP 7, PHP 8)

mt_rand透過梅森旋轉演算法產生亂數值

說明

mt_rand(): 整數
mt_rand(整數 $min, 整數 $max): 整數

許多舊版 libc 的隨機數產生器具有可疑或未知的特性,而且速度緩慢。mt_rand() 函式可以直接取代舊的 rand() 函式。它使用具有已知特性的梅森旋轉演算法(» Mersenne Twister)的隨機數產生器,產生隨機數的速度比一般 libc 的 rand() 函式快四倍。

如果沒有指定 minmax 參數,mt_rand() 會回傳一個介於 0 和 mt_getrandmax() 之間的偽隨機值。例如,如果您想要一個介於 5 和 15 之間(含)的隨機數,請使用 mt_rand(5, 15)

注意

此函式不會產生密碼學安全的數值,而且*絕不能*用於密碼學用途,或需要回傳值不可預測的用途。

如果需要密碼學安全的隨機性,可以使用 Random\Randomizer 類別搭配 Random\Engine\Secure 引擎。對於簡單的使用案例,random_int()random_bytes() 函式提供了一個方便且安全的 API,它由作業系統的 CSPRNG 支援。

參數

min

可選的最小回傳值(預設值:0)

max

可選的最大回傳值(預設值:mt_getrandmax()

回傳值

介於 min(或 0)和 max(或 mt_getrandmax())之間(含)的隨機整數值,如果 max 小於 min,則回傳 false

更新日誌

版本 說明
7.2.0 mt_rand() 已修正 模數偏差錯誤。這表示在 64 位元機器上,使用特定種子產生的序列可能與 PHP 7.1 不同。
7.1.0 rand() 已成為 mt_rand() 的別名。
7.1.0 mt_rand() 已更新 為使用修正後的、正確的梅森旋轉演算法版本。要恢復舊的行為,請使用 mt_srand(),並將第二個參數設為 MT_RAND_PHP

範例

範例 #1 mt_rand() 範例

<?php
echo mt_rand(), "\n";
echo
mt_rand(), "\n";

echo
mt_rand(5, 15), "\n";
?>

以上範例會輸出類似以下的內容

1604716014
1478613278
6

註釋

警告

min max 範圍必須在 mt_getrandmax() 的範圍內。也就是說,(max - min) <= mt_getrandmax()。否則,mt_rand() 產生的亂數品質可能會比預期差。

參見

新增註釋

使用者貢獻的註釋 3 則註釋

greald at ghvernuft dot nl
1 年前
要查看一些與均勻分佈的系統性偏差,請執行

<?php
$alfabet
= str_split('ADHKLMNPSTUWX');
$countalfabet = count($alfabet)-1;
$code = array_fill_keys($alfabet, 0);
for (
$L=0; $L<80*$countalfabet; $L++)
{
$lettr = floor(mt_rand ( 0, $countalfabet ));
$code[$alfabet[$lettr]]++;
}

foreach(
$code as $L => $Freq)
{
for(
$F=0; $F<$Freq; $F++)
{
echo
$L;
}
echo
"\n<br/>";
}
?>
Pawe Krawczyk
11 年前
重申關於*不要*將 mt_rand() 用於任何安全性相關事項的訊息,這裡有一個剛發布的新工具,它可以透過單個 mt_rand() 輸出值來恢復種子值。

http://www.openwall.com/php_mt_seed/README
To Top