Mt srand: примеры (PHP)

Использование mt_srand для генерации случайных чисел в PHP
Раздел: Математические функции
mt_srand(int $seed = 0, int $mode = MT_RAND_MT19937): void
Описание функции mt_srand

Функция mt_srand() в PHP используется для инициализации генератора псевдослучайных чисел (ГПСЧ) с помощью алгоритма Mersenne Twister. Эта функция задает начальное значение (seed), от которого начинается последовательность случайных чисел. Инициализация позволяет воспроизводить одинаковые последовательности случайных чисел при одинаковом начальном значении, что полезно для отладки или тестирования.

Функция применяется перед использованием функций, зависящих от ГПСЧ, таких как mt_rand(), mt_getrandmax().

Аргументы функции
  • $seed (необязательный, int): Целочисленное значение для инициализации генератора. Начиная с PHP 4.2.0, если параметр опущен, используется случайное значение, основанное на текущем времени и других факторах.
  • $mode (необязательный, int): Константа, определяющая, какую реализацию алгоритма использовать. Доступные значения: MT_RAND_MT19937 (использует стандартную реализацию Mersenne Twister) и MT_RAND_PHP (использует устаревший генератор PHP, доступный для обратной совместимости). По умолчанию используется MT_RAND_MT19937.
Примеры использования mt_srand
Инициализация с числовым seed

Использование целочисленного значения для создания воспроизводимой последовательности.

mt_srand(12345);
echo mt_rand() . "\n";
echo mt_rand() . "\n";
1622650073
984943658
Инициализация без аргументов

Автоматический выбор seed на основе текущего времени и системных параметров.

mt_srand();
echo mt_rand(1, 10) . "\n";
7
Использование режима MT_RAND_PHP

Применение устаревшего генератора для обратной совместимости.

mt_srand(42, MT_RAND_PHP);
echo mt_rand() . "\n";
718761528
Похожие функции в PHP
  • srand() — устаревшая функция для инициализации более простого линейного конгруэнтного генератора. Менее качественная случайность по сравнению с Mersenne Twister. Используется только для совместимости со старым кодом.
  • random_int() — генерирует криптографически безопасные псевдослучайные целые числа. Не требует предварительной инициализации seed. Рекомендуется для задач, связанных с безопасностью.
  • rand() — псевдоним srand()/rand(). Также использует устаревший алгоритм. mt_rand() и mt_srand() предпочтительнее из-за лучшей производительности и качества случайности.
Альтернативы в других языках

Mt srand в Python

Функция random.seed() модуля random инициализирует ГПСЧ Mersenne Twister, аналогично mt_srand().

import random
random.seed(12345)
print(random.randint(1, 100))
print(random.randint(1, 100))
54
96

Mt srand в Javascript

Стандартный Math.random() не позволяет задавать seed. Для контролируемого ГПСЧ используют сторонние библиотеки, например, seedrandom.

// С использованием библиотеки seedrandom
// Пример с импортом библиотеки в Node.js:
// const seedrandom = require('seedrandom');
// let rng = seedrandom('hello');
// console.log(rng());
// 0.9282578795792454

Mt srand в MySQL

Функция RAND() может принимать начальное значение как аргумент.

SELECT RAND(42), RAND(42);
0.6612013504887822, 0.6612013504887822
Типичные ошибки
Частая повторная инициализация

Многократный вызов mt_srand() в цикле или при каждом запросе может привести к снижению случайности.

for ($i = 0; $i < 5; $i++) {
    mt_srand(123);
    echo mt_rand(1, 10) . " ";
}
7 7 7 7 7
Использование времени как seed в циклах

Если инициализировать генератор значением времени внутри быстрого цикла, можно получить одинаковые seed.

for ($i = 0; $i < 3; $i++) {
    mt_srand(time());
    usleep(1000); // Небольшая задержка
    echo mt_rand() . "\n";
}
// Возможно одинаковые значения, если время не изменилось
Изменения в последних версиях PHP
  • В PHP 7.1.0: Функция mt_srand() стала объявлена устаревшей как alias для srand(). Однако это относится только к внутренней реализации, и mt_srand() осталась рекомендуемой для Mersenne Twister.
  • В PHP 8.3.0: Добавлен параметр $mode, позволяющий выбирать между MT_RAND_MT19937 и MT_RAND_PHP.
  • С PHP 8.2.0: Генерация случайных чисел по умолчанию использует более безопасные источники энтропии, если seed не указан.
Расширенные примеры
Генерация повторяемой последовательности для тестов
Пример php
mt_srand(100);
$sequence = [];
for ($i = 0; $i < 5; $i++) {
    $sequence[] = mt_rand(1, 100);
}
print_r($sequence);
// Повторная инициализация тем же seed
mt_srand(100);
$sequence2 = [];
for ($i = 0; $i < 5; $i++) {
    $sequence2[] = mt_rand(1, 100);
}
print_r($sequence2);
Array
(
    [0] => 86
    [1] => 37
    [2] => 13
    [3] => 63
    [4] => 89
)
Array
(
    [0] => 86
    [1] => 37
    [2] => 13
    [3] => 63
    [4] => 89
)
Использование строки как seed

Преобразование строки в целочисленное значение через crc32 для использования в mt_srand.

Пример php
$seedString = "my seed string";
$seed = crc32($seedString);
mt_srand($seed);
echo mt_rand(1, 1000);
478
Создание генератора с отдельным состоянием

Использование mt_srand() для создания изолированного контекста генерации чисел.

Пример php
function createRandomGenerator($seed) {
    mt_srand($seed);
    return function($min, $max) {
        return mt_rand($min, $max);
    };
}
$generator1 = createRandomGenerator(555);
$generator2 = createRandomGenerator(555);
echo $generator1(1, 10) . " " . $generator2(1, 10);
8 8

PHP mt_srand function comments

En
Mt srand Seeds the Mersenne Twister Random Number Generator