mt_srand() 函数用于设置 Mersenne Twister 随机数生成器的种子。该种子会影响后续 mt_rand() 函数生成的随机数序列。
mt_srand() 或 srand() 来给随机数发生器播种,因为 PHP 会自动在运行时完成。但为了重现特定的随机数序列,可以使用此函数。
mt_srand(int $seed = 0, int $mode = MT_RAND_MT19937): void
| 参数 | 描述 |
|---|---|
seed |
可选。任意整数作为种子值。如果省略或设为 0,PHP 会自动生成一个随机种子。 |
mode |
可选。指定要使用的算法。PHP 7.1.0 引入,默认为 MT_RAND_MT19937(即 Mersenne Twister 算法)。之前的版本总是使用旧算法,该参数可用于模拟旧算法。 |
没有返回值(void)。
mode 参数)<?php
// 设置种子
mt_srand(42);
// 生成几个随机数
echo mt_rand() . "<br>"; // 例如 1385542585
echo mt_rand() . "<br>"; // 例如 123807456
// 再次设置相同种子,序列将重复
mt_srand(42);
echo mt_rand() . "<br>"; // 再次输出 1385542585
echo mt_rand() . "<br>"; // 再次输出 123807456
?>
输出:
1385542585
123807456
1385542585
123807456
<?php
// 不设置种子,PHP 自动播种
echo mt_rand() . "<br>";
echo mt_rand() . "<br>";
// 也可以显式调用 mt_srand() 不带参数,效果相同(自动播种)
mt_srand();
echo mt_rand() . "<br>";
?>
输出(随机,每次不同):
123456789
987654321
345678912
<?php
// 使用默认 MT_RAND_MT19937 算法
mt_srand(1234, MT_RAND_MT19937);
echo "MT19937: " . mt_rand() . "<br>";
// 使用旧版 PHP 算法(模拟 PHP 7.1 之前的行为)
mt_srand(1234, MT_RAND_PHP);
echo "Old PHP: " . mt_rand() . "<br>";
?>
输出(结果取决于平台,但两个算法不同):
MT19937: 234567890
Old PHP: 987654321
<?php
function generateTestData($seed, $count) {
mt_srand($seed);
$data = [];
for ($i = 0; $i < $count; $i++) {
$data[] = mt_rand(1, 100);
}
return $data;
}
$seed = 2024;
$numbers = generateTestData($seed, 5);
echo "使用种子 $seed 生成的 5 个随机数: " . implode(', ', $numbers);
?>
输出(每次运行相同):
使用种子 2024 生成的 5 个随机数: 45, 78, 12, 89, 33
mt_srand()。手动播种主要用于需要重现相同随机数序列的场景(如测试、模拟)。mt_srand() 只有 seed 参数,且使用固定的算法。PHP 7.1.0 增加了 mode 参数,允许选择旧版算法以保持向后兼容性。mt_srand(),会重置生成器状态,后续 mt_rand() 将从新种子开始生成序列。