PHP Conference Japan 2024

Random\Engine::generate

(PHP 8 >= 8.2.0)

Random\Engine::generate產生隨機性

說明

public Random\Engine::generate(): 字串

返回隨機性並將演算法的狀態推進一步。

隨機性由包含隨機位元組的二進位制字串表示。這種表示法可以明確地解釋演算法產生的隨機位元,例如,以適應不同演算法使用的不同輸出大小。

原生操作整數值的演算法應以小端序位元組順序返回整數,例如利用 pack() 函式搭配 P 格式碼。如果需要數值表示,Random\Randomizer 提供的高階介面會將返回的隨機位元組解釋為無符號小端序整數。

強烈建議返回字串的每一個位元都應均勻且獨立地選取,因為某些應用程式需要基於位元層級的隨機性才能正常運作。例如,線性同餘產生器通常會為返回整數值的較低有效位元產生較低品質的隨機性,因此不適用於需要位元層級隨機性的應用程式。

參數

此函式沒有參數。

回傳值

包含隨機位元組的非空字串。

注意Random\Randomizer 內部使用無符號 64 位元整數。如果返回的字串包含超過 64 位元(8 位元組)的隨機性,則超過的位元組將被忽略。其他應用程式可能能夠一次處理超過 64 位元。

錯誤/例外

範例

範例 #1 Random\Engine::generate() 範例

<?php
/**
* 實作一個線性同餘產生器,模數為 65536,
* 乘數為 61,增量為 17,返回一個 8 位元整數。
*
* 注意:此引擎僅適用於示範目的。
* 線性同餘產生器通常會產生低
* 品質的隨機性,而且此特定實作具有
* 非常短的 16 位元週期,不適合
* 幾乎任何實際應用案例。
*/
final class LinearCongruentialGenerator implements \Random\Engine
{
private
int $state;

public function
__construct(?int $seed = null)
{
if (
$seed === null) {
$seed = random_int(0, 0xffff);
}

$this->state = $seed & 0xffff;
}

public function
generate(): string
{
$this->state = (61 * $this->state + 17) & 0xffff;

return
pack('C', $this->state >> 8);
}
}

$r = new \Random\Randomizer(
new
LinearCongruentialGenerator(seed: 1)
);

echo
"幸運數字:", $r->getInt(0, 99), "\n";
?>

以上範例將輸出

Lucky Number: 4
新增註釋

使用者提供的註釋

此頁面沒有使用者提供的註釋。
To Top